1

リスト内のリストから1つのdata.frameを形成したい

L1 <- list(A = c(1, 2, 3), B = c(5, 6, 7))
L2 <- list(A = c(11, 22, 33), B = c(15, 16, 17))
L3 <- list(L1, L2)
L3

library(data.table)

「data.table」のマニュアルによると、「「rbindlist」は do.call("rbind",l) と同じですが、はるかに高速です」

Rベースパッケージを使用して「rbindlist」が行うことを実現したいと思います

rbindlist は私が必要としているものを正確に実行しますが、「do.call」はそうではありません!

rbindlist(L3)

do.call は私が望むことをしません

do.call(rbind, L3)

identical(rbindlist(L3), do.call(rbind, L3))
4

2 に答える 2

5

as.data.frame毎回電話するのは割高だと思います。どうですか?

as.data.frame(do.call(mapply, c(L3, FUN=c, SIMPLIFY=FALSE)))

mapply基本的に L3 の最初の要素を取り、関数を適用しFUN、次に 2 番目の要素などを適用します...2 つのリスト (L3[[1]]L3[[2]]) があるとします。

mapply(FUN=c, L3[[1]], L3[[2]], SIMPLIFY=FALSE)

ここでSIMPLIFY=FALSEは、出力が行列に変換 (または単純化) されていないことを確認します。したがって、それはリストになります。一般的なケースではdo.call、 function の他のすべての引数とともにリストを使用して渡しますmapply。お役に立てれば。


ビッグデータのベンチマーク:

ll <- unlist(replicate(1e3, L3, simplify=FALSE), rec=FALSE)

aa <- function() as.data.frame(do.call(mapply, c(ll, FUN=c, SIMPLIFY=FALSE)))
bb <- function() do.call(rbind, lapply(ll, as.data.frame))

require(microbenchmark)
microbenchmark(o1 <- aa(), o2 <- bb(), times=10)

Unit: milliseconds
       expr        min         lq     median         uq      max neval
 o1 <- aa()   4.356838   4.931118   5.462995   7.623445  20.5797    10
 o2 <- bb() 673.773795 683.754535 701.557972 710.535860 724.2267    10

identical(o1, o2) # [1] TRUE
于 2013-08-28T13:19:10.087 に答える