66

我有一个长度为 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))
}
4

5 回答 5

143

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

output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
于 2012-11-05T01:08:47.120 回答
16

你想要

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 上做了这个)。

于 2012-11-05T01:05:18.353 回答
7

获取有关您的输出的示例信息会有所帮助。不推荐递归地使用rbind越来越大的东西。我的第一个猜测可以帮助你:

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

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

于 2012-11-05T00:50:00.600 回答
3

你也可以使用,

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

内存使用情况非常相似

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

mem_changed()可以使用from进行验证library(pryr)

于 2018-12-04T16:13:32.157 回答
-5

您可以使用 as.matrix 如下:

output <- as.matrix(z)
于 2016-09-14T07:39:42.577 回答