1. ホーム
  2. r

[解決済み] なぜrbindlistはrbindより「良い」のですか?

2022-05-15 12:28:34

質問

のドキュメントを見ています。 data.table のドキュメントを読んでいて、また、ここ SO でのいくつかの会話から気づいたのですが rbindlist よりも優れていると思われます。 rbind .

私は、なぜ rbindlist よりも rbind で、どのようなシナリオで rbindlist が本当に優れているのは rbind ?

メモリ使用量にメリットはありますか?

どのように解決するのですか?

rbindlist は、最適化されたバージョンの do.call(rbind, list(...)) を使用すると遅いことで知られています。 rbind.data.frame


本当に優れているのはどこなのか

どこが得意なのかを示すいくつかの質問 rbindlist はどこにあるのでしょうか?

data.frameのリストを行単位でベクトル化した高速マージ

do.callとldplyを用いた長いdata.frameのリスト(~100万)から単一のdata.frameへの変換の不具合

これらは、どれだけ速くなるかを示すベンチマークがあります。


rbind.data.frameが遅いのには理由があります。

rbind.data.frame は多くのチェックを行い、名前によってマッチングします。(すなわち、rbind.data.frameは、カラムが異なる順番で並んでいるかもしれないという事実を考慮し、名前によってマッチングします)。 rbindlist はこのようなチェックを行わず、位置によって結合します。

eg

do.call(rbind, list(data.frame(a = 1:2, b = 2:3), data.frame(b = 1:2, a = 2:3)))
##    a b
## 1  1 2
## 2  2 3
## 3  2 1
## 4  3 2

rbindlist(list(data.frame(a = 1:5, b = 2:6), data.frame(b = 1:5, a = 2:6)))
##     a b
##  1: 1 2
##  2: 2 3
##  3: 1 2
##  4: 2 3


rbindlist のその他の制限事項

それは で使用されます。 に対処するのに苦労した。 factors を処理するのに苦労していたのですが、バグが修正されたためです。

rbindlist 2つのdata.tablesで、一方がfactorを持ち、もう一方が列のcharacter typeを持つ場合。 ( バグ番号 2650 )

カラム名が重複する問題がある

参照 Warning message: in rbindlist(allargs) : coercionで導入されたNA: data.tableのバグの可能性? ( バグ番号 2384 )


rbind.data.frameのローネームはイライラさせることがあります。

rbindlist を扱うことができます。 lists data.framesdata.tables というように、ローネームを含まないdata.tableが返されます。

を使用すると、rownameの混乱に巻き込まれる可能性があります。 do.call(rbind, list(...)) を見る

do.call内でrbindを使用する際、行の名前を変更しないようにするにはどうすればよいですか?


メモリ効率

メモリに関して rbindlist が実装されているのは C で実装されているため、メモリ効率が良く、また setattr を使用して参照によって属性を設定します。

rbind.data.frame が実装されているのは R で実装されており、多くの代入を行い、また attr<- (そして class<-rownames<- はすべて、作成された data.frame のコピーを (内部的に) 作成します。