Объединить список матриц в big.matrix
У меня есть список больших (35000 x 3) матриц в R, и я хочу объединить их в одну матрицу, но это будет около 1 миллиарда строк в длину и будет превышать максимальный размер объекта в R.
Пакет bigmemory допускает большие матрицы, но , похоже, не поддерживает rbind
положить несколько матриц вместе.
Есть ли какой-то другой пакет или метод, который поддерживает создание очень большой матрицы из меньших матриц?
Кроме того, прежде чем вы спросите, это не проблема ОЗУ, просто ограничение R даже на 64-битной R.
2 ответа
Вы можете реализовать это с помощью цикла:
library(bigmemory)
## Reproducible example
mat <- matrix(1, 50e3, 3)
l <- list(mat)
for (i in 2:100) {
l[[i]] <- mat
}
## Solution
m <- ncol(l[[1]]) ## assuming that all have the same number of columns
n <- sum(sapply(l, nrow))
bm <- big.matrix(n, m)
offset <- 0
for (i in seq_along(l)) {
mat_i <- l[[i]]
n_i <- nrow(mat_i)
ind_i <- seq_len(n_i) + offset
bm[ind_i, ] <- mat_i
offset <- offset + n_i
}
## Verif
stopifnot(offset == n, all(bm[, 1] == 1))
Не совсем ответ, но немного больше, чем комментарий: вы уверены, что не можете сделать это грубой силой? R теперь имеет длинные векторы (начиная с версии 3.0.0; вопрос, на который вы ссылаетесь, относится к версии 2.14.1 R): с этой страницы
Массивы (включая матрицы) могут основываться на длинных векторах при условии, что каждое из их измерений не превышает 2^31 - 1: таким образом, нет одномерных длинных массивов.
в то время как базовый атомный вектор может доходить до 2^52 -1 элементов ("в теории... пределы адресного пространства современных процессоров и ОС будут намного меньше"). Это означает, что в принципе вы должны быть в состоянии создать матрицу, которая ((2^31)-1)/1e9
= 2,1 миллиарда строк в длину; поскольку максимальный "длинный" размер объекта составляет около 10^15 (т. е. буквально миллионы миллиардов), матрица из 1 миллиарда строк и 3 столбцов (теоретически) не должна быть проблемой.