Как расплавить матрицу 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)
Другие вопросы по тегам