我有一个长度为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))
}
我有一个长度为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))
}
这段代码应该与您当前的代码等价,只是更快:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
unlist
中设置USE.NAMES=FALSE
以节省时间和内存。 建议将unlist
函数中的参数USE.NAMES
设置为FALSE
,以提高代码的运行速度并减少内存使用。 - Joshua Ulrichuse.names
(即小写)。 - Johan Larssonoutput <- matrix(unlist(z), ncol = 10, byrow = TRUE, use.names=FALSE)
。 - mikey我认为你想要的是
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上完成了这个问题)。
如果您能提供有关输出的样本信息,将会很有帮助。不建议在越来越大的数据上递归地使用rbind
。我第一个猜测可能会对您有所帮助:
z <- list(1:3,4:6,7:9)
do.call(rbind,z)
如有需要,可以查看相关问题以获得更高效的方法。
您还可以使用以下方法,
output <- as.matrix(as.data.frame(z))
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
library(pryr)
中的mem_changed()
来验证。您可以按如下方式使用as.matrix:
output <- as.matrix(z)
z[1:2]
的例子吗? - David Robinsonz[1:2]
吗? - David Robinson