25

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

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

私はそれをやってきた

Reduce('rbind', data.table)

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

Tnx!

4

3 に答える 3

26

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

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

于 2012-09-03T17:34:42.457 に答える
22

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
于 2012-09-03T17:21:05.030 に答える
2

私のお金のために、plyrパッケージldplyはこれを行うための方法です。リスト要素の名前が、という名前の新しい最初の列として追加されるという利点があります.id

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

代替案には、do.call("rbind", mylist)またはラティスが含まmake.groupsれます(最近これを見つけることができませんでした)。


注:質問を誤解した可能性があります-のdata.frame代わりに読みましたdata.tabledata.tableこれらのテクニックはまだ機能しますが、常に結果が出るかどうかはわかりません。

于 2012-09-05T03:43:17.970 に答える