更新:代わりに、この更新された回答を参照してください。
UPDATE (eddi):これはバージョン 1.8.11fill
で への引数として実装されましたrbind
。例えば:
DT1 = data.table(a = 1:2, b = 1:2)
DT2 = data.table(a = 3:4, c = 1:2)
rbind(DT1, DT2, fill = TRUE)
# a b c
#1: 1 1 NA
#2: 2 2 NA
#3: 3 NA 1
#4: 4 NA 2
FR #4790が追加されました - data.frames/data.tables のリストをマージする rbind.fill (plyr から) のような機能
注 1:
このソリューションでは、data.table
のrbindlist
関数を使用して data.tables のリストを "rbind"します。このためには、バージョン < 1.8.9でのこのバグのため、必ずバージョン 1.8.9 を使用してください。
注 2:
rbindlist
現在のところ、data.frames/data.tables のリストをバインドすると、最初の列のデータ型が保持されます。つまり、最初の data.frame の列が文字で、2 番目の data.frame の同じ列が "factor" の場合、rbindlist
この列は文字になります。したがって、data.frame がすべての文字列で構成されている場合、このメソッドを使用したソリューションは plyr メソッドと同じになります。そうでない場合、値は同じままですが、一部の列は係数ではなく文字になります。後で自分で "factor" に変換する必要があります。この動作が将来変更されることを願っています。
そして今、ここで使用しています(およびfromとのdata.table
ベンチマーク比較):rbind.fill
plyr
require(data.table)
rbind.fill.DT <- function(ll) {
# changed sapply to lapply to return a list always
all.names <- lapply(ll, names)
unq.names <- unique(unlist(all.names))
ll.m <- rbindlist(lapply(seq_along(ll), function(x) {
tt <- ll[[x]]
setattr(tt, 'class', c('data.table', 'data.frame'))
data.table:::settruelength(tt, 0L)
invisible(alloc.col(tt))
tt[, c(unq.names[!unq.names %chin% all.names[[x]]]) := NA_character_]
setcolorder(tt, unq.names)
}))
}
rbind.fill.PLYR <- function(ll) {
rbind.fill(ll)
}
require(microbenchmark)
microbenchmark(t1 <- rbind.fill.DT(ll), t2 <- rbind.fill.PLYR(ll), times=10)
# Unit: seconds
# expr min lq median uq max neval
# t1 <- rbind.fill.DT(ll) 10.8943 11.02312 11.26374 11.34757 11.51488 10
# t2 <- rbind.fill.PLYR(ll) 121.9868 134.52107 136.41375 184.18071 347.74724 10
# for comparison change t2 to data.table
setattr(t2, 'class', c('data.table', 'data.frame'))
data.table:::settruelength(t2, 0L)
invisible(alloc.col(t2))
setcolorder(t2, unique(unlist(sapply(ll, names))))
identical(t1, t2) # [1] TRUE
リスト サイズが約 500 になるまで、この特定plyr
のソリューションを超えるエッジがあることに注意してください。rbind.fill
data.table
ベンチマーク プロット:
リストの長さが data.frames である実行のプロットを次に示しseq(1000, 10000, by=1000)
ます。microbenchmark
これらの異なるリストの長さのそれぞれで10回の担当者を使用しました.
ベンチマークの要点:
誰かが結果を再現したい場合に備えて、ベンチマークの要点を次に示します。