163

私の質問は、参照による割り当てとコピーによる割り当てに関連していdata.tableます。次のように、参照によって行を削除できるかどうかを知りたい

DT[ , someCol := NULL]

について知りたい

DT[someRow := NULL, ]

この関数が存在しないのには十分な理由があると思います。そのため、以下のように、通常のコピー アプローチに代わる適切な方法を指摘していただければ幸いです。特に、example(data.table) のお気に入りを使用すると、

DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
#      x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9

この data.table から最初の行を削除したいとします。私はこれを行うことができることを知っています:

DT <- DT[-1, ]

しかし、オブジェクトをコピーしているため、それを避けたい場合がよくあります (ここで指摘されているようobject.size(DT)に、 N の場合、約 3*N のメモリが必要です。今、私は を見つけました。特定の値を設定する方法を知っています (ここのように: set all)行 1 と 2 および列 2 と 3 の値をゼロに)set(DT, i, j, value)

set(DT, 1:2, 2:3, 0) 
DT
#      x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9

しかし、どうすれば最初の 2 行を消去できますか? やっている

set(DT, 1:2, 1:3, NULL)

DT 全体を NULL に設定します。

私の SQL の知識は非常に限られているので、教えてください: data.table が SQL テクノロジを使用している場合、SQL コマンドに相当するものはありますか?

DELETE FROM table_name
WHERE some_column=some_value

data.table?

4

6 に答える 6

129

良い質問。data.table参照によって行を削除することはまだできません。

data.tableご存知のように、列ポインターのベクトルを過剰に割り当てるため、参照によってを追加および削除できます。計画は、行に対して同様のことを行い、高速insertおよびdelete. 行の削除はmemmove、C で使用して、削除された行の後に (すべての列で) 項目を移動します。テーブルの途中で行を削除しても、SQL などの行ストア データベースと比較すると、依然として非常に非効率的です。SQL は、行がテーブル内にある場合に行を高速に挿入および削除するのにより適しています。それでも、行を削除せずに新しい大きなオブジェクトをコピーするよりもはるかに高速です。

一方、列ベクトルは過剰に割り当てられるため、最後に行が即座に挿入 (および削除) される可能性があります。たとえば、成長する時系列。


問題として提出されています: Delete rows by reference

于 2012-05-29T00:20:29.977 に答える
29

メモリの使用をインプレース削除と同様にするために私が取ったアプローチは、一度に列をサブセット化して削除することです。適切な C memmove ソリューションほど高速ではありませんが、ここで気にするのはメモリの使用だけです。このようなもの:

DT = data.table(col1 = 1:1e6)
cols = paste0('col', 2:100)
for (col in cols){ DT[, (col) := 1:1e6] }
keep.idxs = sample(1e6, 9e5, FALSE) # keep 90% of entries
DT.subset = data.table(col1 = DT[['col1']][keep.idxs]) # this is the subsetted table
for (col in cols){
  DT.subset[, (col) := DT[[col]][keep.idxs]]
  DT[, (col) := NULL] #delete
}
于 2014-01-21T18:39:18.060 に答える
4

代わりに、またはNULLに設定しようとすると、NAに設定してみてください(最初の列のNAタイプと一致します)

set(DT,1:2, 1:3 ,NA_character_)
于 2012-05-28T22:33:18.413 に答える