web-dev-qa-db-ja.com

data.tableオブジェクトの最後に参照によって行を追加します

これで 質問 the data.tableパッケージ作成者は、中央の参照で行を挿入(または削除)できない理由を説明しますdata.tableまだ。彼はまた、そのような操作がテーブルの最後で可能になるかもしれないと指摘しています。このアクションを実行するコードを見せていただけますか?それは、「参照」バージョンの

a<- data.table(id=letters[1:2], var=1:2)
> a
   id var
1:  a   1
2:  b   2
> rbind(a, data.table(id="c", var=3))
   id var
1:  a   1
2:  b   2
3:  c   3

ありがとう。

編集:

適切な解決策はまだ可能ではないので、速度とメモリ使用量の観点から、次のどれが(内部的に異なる場合、確実ではない)良いですか?

rbind(a, data.table(id="c", var=3))

rbindlist(list(a,  data.table(id="c", var=3)))

最終的に他の(より良い)方法がありますか?

38
Michele

編集に回答するには、ベンチマークを実行するだけです:

a = data.table(id=letters[1:2], var=1:2)
b = copy(a)
c = copy(b) # let's also just try modifying same value in place
            # to see how well changing existing values does
microbenchmark(a <- rbind(a, data.table(id="c", var=3)),
               b <- rbindlist(list(b,  data.table(id="c", var=3))),
               c[1, var := 3L],
               set(c, 1L, 2L, 3L))
#Unit: microseconds
#                                                  expr     min        lq    median        uq      max neval
#          a <- rbind(a, data.table(id = "c", var = 3)) 865.460 1141.2585 1357.1230 1539.4300 6814.492   100
#b <- rbindlist(list(b, data.table(id = "c", var = 3))) 260.440  325.3835  445.4190  522.8825 1143.930   100
#                                   c[1, `:=`(var, 3L)] 482.147  626.5570  778.3135  904.3595 1109.539   100
#                                    set(c, 1L, 2L, 3L)   2.339    5.677    7.5140    9.5170   19.033   100

rbindlistrbindより明らかに優れています。ループで[を使用する際の問題を指摘したMatthew Dowleのおかげで、setを使用した別のベンチマークを追加しました。

上記から、最良のオプションはrbindlistを使用するか、最初にdata.tableのサイズを変更してから値を設定することです(std::vectorC++と同様の戦略を使用して、実行するたびにサイズを2倍にすることもできます)開始するデータのサイズがわからない場合は十分なスペースを確保してください。データの入力が完了したら、余分な行を削除してください)。

22
eddi