欠落している列を(正しいタイプとNAで)挿入するさらに別の方法は、2番目のdata.tableの構造を持つ空のdata.tableを使用しmerge()
て最初のdata.tableに挿入することです。これにより、ユーザー関数にバグが発生する可能性がなくなります(自分のコードよりも信頼性が高いことはわかっています;))。上からmnelのテーブルを使用して、以下のコードのようなことを行います。A
A2[0]
merge()
また、をrbindlist()
処理するときは、使用がはるかに高速になるはずdata.tables
です。
テーブルを定義します(上記のmnelのコードと同じ):
library(data.table)
A <- data.table(a=1:3, b=1:3, c=1:3)
A2 <- data.table(a=6:9, b=6:9, c=6:9)
B <- data.table(b=1:3, c=1:3, d=1:3, m=LETTERS[1:3])
C <- data.table(n=round(rnorm(3), 2), f=c(T, F, T), c=7:9)
不足している変数をテーブルAに挿入します:(の使用に注意してくださいA2[0]
A <- merge(x=A, y=A2[0], by=intersect(names(A),names(A2)), all=TRUE)
欠落している列をテーブルA2に挿入します。
A2 <- merge(x=A[0], y=A2, by=intersect(names(A),names(A2)), all=TRUE)
これで、同じタイプの同じ列が必要になりA
ます。A2
念のため、列の順序を一致するように設定します(おそらく不要であり、rbindlist()
列名または列位置にバインドされているかどうかはわかりません)。
setcolorder(A2, names(A))
DT.ALL <- rbindlist(l=list(A,A2))
DT.ALL
他のテーブルについても繰り返します...手作業で繰り返すよりも、これを関数に入れる方がよいかもしれません...
DT.ALL <- merge(x=DT.ALL, y=B[0], by=intersect(names(DT.ALL), names(B)), all=TRUE)
B <- merge(x=DT.ALL[0], y=B, by=intersect(names(DT.ALL), names(B)), all=TRUE)
setcolorder(B, names(DT.ALL))
DT.ALL <- rbindlist(l=list(DT.ALL, B))
DT.ALL <- merge(x=DT.ALL, y=C[0], by=intersect(names(DT.ALL), names(C)), all=TRUE)
C <- merge(x=DT.ALL[0], y=C, by=intersect(names(DT.ALL), names(C)), all=TRUE)
setcolorder(C, names(DT.ALL))
DT.ALL <- rbindlist(l=list(DT.ALL, C))
DT.ALL
結果は、mnelsの出力と同じように見えます(乱数と列の順序を除く)。
PS1:元の作者は、一致する変数がある場合に何をすべきかを述べていません-本当にやりたいのですか、それともrbind()
考えていmerge()
ますか?
PS2 :(コメントするのに十分な評判がないので)質問の要点はこの質問の複製のようです。data.table
大規模なデータセットを使用した場合と比較した場合のベンチマークにも重要ですplyr
。