如何更有效地将巨大的矢量列表转换为矩阵?

时间:2012-11-05 00:40:34

标签: r list matrix performance

我有一个长度为130,000的列表,其中每个元素都是长度为110的字符向量。我想将此列表转换为维度为1,430,000 * 10的矩阵。我怎样才能更有效率地做到这一点? 我的代码是:

output=NULL
for(i in 1:length(z)) {
 output=rbind(output,
              matrix(z[[i]],ncol=10,byrow=TRUE))
}

5 个答案:

答案 0 :(得分:120)

这应该等同于您当前的代码,速度要快得多:

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

答案 1 :(得分:15)

认为你想要

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秒(我在2岁的MacBook Pro上做了这个)

答案 2 :(得分:5)

有关输出的示例信息会很有帮助。在更大更大的事情上递归使用rbind 不推荐。我首先想到的东西可以帮到你:

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

如果需要,请参阅a related question以获得更高的效率。

答案 3 :(得分:0)

您也可以使用

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

内存使用情况与

非常相似
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)

可以使用mem_changed()中的library(pryr)进行验证。

答案 4 :(得分:-5)

您可以使用as.matrix,如下所示:

output <- as.matrix(z)