89

data.tableオブジェクトに := 演算子が追加されました。この演算子が他のすべての代入演算子と異なる点は何ですか? また、その用途は何ですか、どのくらい高速ですか、いつ回避する必要がありますか?

4

1 に答える 1

96

10分を1秒に短縮した例です(ホームページのNEWSより)。これは a へのサブアサインに似て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[...]のオーバーヘッドはわずかです。たとえば、S3 のディスパッチと、、など[.data.tableの引数の存在とタイプのチェックなどです。したがって、内部ループには、低オーバーヘッドの直接バージョンのcalled があります。詳細と例については、 を参照してください。インクルードの欠点は、行番号である必要があり (バイナリ検索なし)、 と組み合わせることはできません。これらの制限を行うことで、オーバーヘッドを大幅に削減できます。ibynomatchfor:=set?setsetibyset

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018
于 2011-08-11T17:18:31.417 に答える