Подтвердить что ты не робот

Как преобразовать огромный вектор-список в матрицу более эффективно в R?

У меня есть список длиной 130 000, где каждый элемент является символьным вектором длиной 110. Я хотел бы преобразовать этот список в матрицу размером 1,430,000 * 10. Как я могу сделать это более эффективно? Мой код:

output=NULL
for(i in 1:length(z)) output=rbind(output,matrix(z[[i]],ncol=10,byrow=T))
4b9b3361

Ответ 1

Это должно быть эквивалентно вашему текущему коду, только намного быстрее:

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)

Ответ 2

Я думаю, что вы хотите

output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))

то есть. комбинируя использование @BlueMagister do.call(rbind,...) с оператором lapply для преобразования отдельных элементов списка в матрицы 11 * 10...

Контрольные показатели (показывая решение @flodel unlist в 5 раз быстрее, чем мое, и в 230 раз быстрее, чем исходный подход...)

n <- 1000
z <- replicate(n,matrix(1:110,ncol=10,byrow=TRUE),simplify=FALSE)
library(rbenchmark)
origfn <- function(z) {
    output <- NULL 
    for(i in 1:length(z))
        output<- rbind(output,matrix(z[[i]],ncol=10,byrow=TRUE))
}
rbindfn <- function(z) do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))
unlistfn <- function(z) matrix(unlist(z), ncol = 10, byrow = TRUE)

##          test replications elapsed relative user.self sys.self 
## 1   origfn(z)          100  36.467  230.804    34.834    1.540  
## 2  rbindfn(z)          100   0.713    4.513     0.708    0.012 
## 3 unlistfn(z)          100   0.158    1.000     0.144    0.008 

Если это масштабируется должным образом (т.е. вы не сталкиваетесь с проблемами памяти), полная проблема займет около 130 * 0,2 секунды = 26 секунд на сопоставимой машине (я сделал это на двухлетнем MacBook Pro).

Ответ 3

Это поможет получить пробную информацию о вашем выходе. Рекурсивно использовать rbind для больших и больших вещей не рекомендуется. Мое первое предположение о том, что вам поможет:

z <- list(1:3,4:6,7:9)
do.call(rbind,z)

См. связанный вопрос для большей эффективности, если это необходимо.

Ответ 4

Вы также можете использовать,

output <- as.matrix(as.data.frame(z))

Использование памяти очень похоже на

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)

Что можно проверить, с mem_changed() из library(pryr).

Ответ 5

вы можете использовать as.matrix, как показано ниже:

output <- as.matrix(z)