私の質問は、参照による割り当てとでのコピーに関連してい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, ]
我々は、オブジェクトのコピー(そのN場合、約3 * Nのメモリを必要としているので、しかし、多くの場合、我々は、それを回避したいことがありobject.size(DT)
、ここで指摘したように。今、私が見つかりました。set(DT, i, j, value)
私はここのように設定し、特定の値(に方法を知っている:すべてのセット行1と2、列2と3の値は0)
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?
DT[ , keep := .I > 1]
、その後の操作のためにサブセットを定義するだけで十分です。DT[(keep), ...]
おそらくsetindex(DT, keep)
、このサブセットの速度ですらあります。万能薬ではありませんが、ワークフローの設計上の選択として検討する価値があります。これらの行をすべてメモリから削除しますか、それとも除外しますか?答えはユースケースによって異なります。
data.table()
SQLのさまざまな操作とへのさまざまな引数の間に類似点を描くことができるほどSQLテクノロジを使用しているとは思いませんdata.table
。私にとって、「テクノロジー」への言及data.table
は、それがSQLデータベースのどこかにあることを幾分示唆していますが、AFAIKはそうではありません。