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

use*_*675 58 performance r list matrix

我有一个长度为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))
}
Run Code Online (Sandbox Code Playgroud)

flo*_*del 122

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

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)

  • +1,但我建议在`unlist`中设置`USE.NAMES = FALSE`以节省时间和内存. (14认同)
  • 它应该是`use.names`(即小写). (9认同)
  • 答对了.这应该比我的解决方案快得多,但我想不到它足够快. (5认同)

Ben*_*ker 15

你想要的

output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))
Run Code Online (Sandbox Code Playgroud)

即将@ 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 
Run Code Online (Sandbox Code Playgroud)

如果这适当地扩展(即你没有遇到内存问题),完全问题将花费大约130*0.2秒= 26秒在同类机器上(我在2岁的MacBook Pro上做到这一点).


Blu*_*ter 6

获取有关输出的示例信息会很有帮助.不建议递归使用rbind越来越大的东西.我首先想到的东西会对你有所帮助:

z <- list(1:3,4:6,7:9)
do.call(rbind,z)
Run Code Online (Sandbox Code Playgroud)

如果需要,请参阅相关问题以提高效率.