data.table
オブジェクトに:=演算子が追加されました。この演算子が他のすべての代入演算子と異なる点は何ですか?また、その用途は何ですか、それはどれくらい速いですか、そしてそれはいつ避けるべきですか?
data.table
オブジェクトに:=演算子が追加されました。この演算子が他のすべての代入演算子と異なる点は何ですか?また、その用途は何ですか、それはどれくらい速いですか、そしてそれはいつ避けるべきですか?
回答:
これは、10分が1秒に短縮された例です(ホームページのNEWSから)。これは、にサブ割り当てするようなものですが、data.frame
毎回テーブル全体をコピーするわけではありません。
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
パッティング:=
でj
より多くのイディオムを可能にするように:
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
および:
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
避ける理由が思いつかない:=
!それ以外は、for
ループ内。:=
内部DT[...]
に表示されるため、[.data.table
メソッドのオーバーヘッドが小さくなります。例えば、S3の派遣とのような引数の有無と種類をチェックi
、by
、nomatch
内部のためなどだから、for
ループは、低オーバーヘッドの直接のバージョンがある:=
と呼ばれますset
。?set
詳細と例については、を参照してください。set
includeの欠点は、i
行番号でなければならず(バイナリ検索なし)、それをと組み合わせることができないことby
です。これらの制限をset
行うことにより、オーバーヘッドを劇的に減らすことができます。
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
、"V1"
列をset(DT, i, colVar, i)
設定しcolVar
ます(たとえば、colVar = "V1"
以前に実行された場合)。引用符は、変数を検索するのではなく、文字通り列名を取得することを示しています。