data.table
オブジェクトに := 演算子が追加されました。この演算子が他のすべての代入演算子と異なる点は何ですか? また、その用途は何ですか、どのくらい高速ですか、いつ回避する必要がありますか?
16694 次
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 があります。詳細と例については、 を参照してください。インクルードの欠点は、行番号である必要があり (バイナリ検索なし)、 と組み合わせることはできません。これらの制限を行うことで、オーバーヘッドを大幅に削減できます。i
by
nomatch
for
:=
set
?set
set
i
by
set
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 に答える