我什么时候应该在data.table中使用:=运算符?

时间:2011-08-11 17:01:50

标签: r data.table colon-equals

data.table个对象现在有一个:=运算符。是什么让这个运算符与所有其他赋值运算符不同?此外,它的用途是什么,它的速度有多快,何时应该避免?

1 个答案:

答案 0 :(得分:89)

以下示例显示10分钟缩短为1秒(来自homepage上的新闻)。这就像是分配给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调度并检查参数的存在和类型,例如ibynomatch等。因此对于内部for循环,开销很低,名为:=的{​​{1}}的直接版本。有关详细信息和示例,请参阅set?set的缺点包括set必须是行号(没有二进制搜索),并且您无法将其与i结合使用。通过制定这些限制by可以大大减少开销。

set