Как преобразовать список в матрицу более эффективно в 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))
4   51   2012-11-05 04:40:34

4 ответа:

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

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

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

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

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

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

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 секунды на сопоставимой машине (я сделал это на 2-летнем MacBook Pro).

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

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

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

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

output <- as.matrix(z)