Как расплавить матрицу 60k x 60k в R
Когда я расплавляю матрицу 60k x 60k (т.е. только числовые значения) с использованием R, melt
функция reshape2
Пакет я получаю следующую ошибку:
>melt(m)
Error in if (n > 0) c(NA_integer_, -n) else integer() : missing value
where TRUE/FALSE needed Calls: melt ... <Anonymous> -> melt.matrix ->
expand.grid -> .set_row_names In addition: Warning messages: 1: In rep.fac * nx
: NAs produced by integer overflow 2: In .set_row_names(as.integer(prod(d)))
: NAs introduced by coercion to integer range
Execution halted
Ошибка не возникает для меньших (например, 20k x 20k) матриц, поэтому я предполагаю, что это связано с размером матрицы. Есть ли другой способ, чтобы расплавить матрицу по-быстрому?
Я тоже пробовал
melt = data.frame(row = c(row(m)), col = c(col(m)), value = c(m))
но это приводит к аналогичной ошибке
Error in if (mirn && nrows[i] > 0L) { :
missing value where TRUE/FALSE needed
Calls: data.frame
In addition: Warning message:
In structure(value, row.names = row.names, class = "data.frame") :
NAs introduced by coercion to integer range
Execution halted
1 ответ
Не самое элегантное решение, но можно разбить объект на два поменьше, расплавить их отдельно, чтобы избежать ошибки переполнения. Затем используйте rbind для объединения полученных расплавленных данных.
m1 <- m[1:30000,]
m2 <- m[30001:nrow(m),]
mymelt1 <- melt(m1, na.rm = TRUE)
mymelt2 <- melt(m12, na.rm = TRUE)
mymelt <- rbind(mymelt1, mymelt2)
remove(mymelt1)
remove(mymelt2)