什么时候应该在data.table中使用:=运算符?
data.table
对象现在有一个:=运算符。 是什么让这个运算符不同于其他赋值运算符? 另外,它的用途是什么,它有多快,什么时候应该避免?
这里是一个例子,显示10分钟减less到1秒(从主页上的 NEWS)。 这就像data.frame
到一个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派遣和检查参数的存在和types,如i
, by
, nomatch
等。因此, for
循环内部for
,有一个低开销的直接版本:=
called set
。 请参阅?set
更多的细节和例子。 set
的缺点包括, i
必须是行号(无二进制search),你不能与它结合。 通过set
这些限制可以显着降低开销。
system.time(for (i in 1:1000) set(DT,i,"V1",i)) user system elapsed 0.016 0.000 0.018