長さ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)
私はあなたが欲しいと思います
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でこれを行いました)。
出力に関するサンプル情報があると役立ちます。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)
mem_changed()
からで確認できますlibrary(pryr)
。
以下のようにas.matrixを使用できます。
output <- as.matrix(z)