web-dev-qa-db-ja.com

data.tablesのリストを組み合わせる

Rでdata.tablesのリストを組み合わせるための特定の方法はありますか?

それぞれが約100万行の約20個のdata.tableのリストがあり、それらを2,000万行の1つのdata.tableに結合したいと思います。

私はそれをやってきた

Reduce('rbind', data.table)

しかし、それは時間がかかります。

Tnx!

23
user680111

見る ?rbindlistおよびこれらの関連する質問(何を検索すればよいかがわかっていると見つけやすくなります!):

rbindlistを含むdata.tableの質問と回答

23
Matt Dowle

do.callの使用は、次の構成例で約10倍高速であるように見えます。

library(data.table)

x1 <- data.table(x = runif(1e6), y = runif(1e6))
x2 <- data.table(x = runif(1e6), y = runif(1e6))

#20 data.tables all of length 1e6
yourList <- list(x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2)

system.time(out1 <- Reduce("rbind", yourList))
#-----
   user  system elapsed 
   3.37    3.03    6.43 
system.time(out2 <- do.call("rbind", yourList))
#-----
   user  system elapsed 
   0.33    0.36    0.68 
all.equal(out1,out2)
#-----
[1] TRUE

編集-マットの答えを組み込む

data.tableがこのタスクに特定の機能を持っていることに気づきませんでした。コースのパー、それはかなり速いです。関連するタイミングは次のとおりです。

system.time(out3 <- rbindlist(yourList))
#-----
   user  system elapsed 
   0.07    0.03    0.11 

all.equal(out1,out3)
#-----
[1] TRUE
22
Chase

私のお金では、plyrパッケージのldplyがこれを行うための手段です。 list要素の名前が_.id_という名前の新しい最初の列として追加されるという利点があります。

さらに、データフレームのリストは、多くの場合tapplyの出力です。この場合、Shebang全体をddplyに置き換えます。

代替手段には、do.call("rbind", mylist)またはlatticeの_make.groups_が含まれます(最近、これを見つけることができませんでした)。


注:私は質問を誤解している可能性があります-私は_data.frame_の代わりに_data.table_を読みました。これらの手法は引き続き機能しますが、常に_data.table_になるかどうかはわかりません。

2
Alex Brown