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

Ari*_*man 84 r data.table colon-equals

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

Mat*_*wle 91

这是一个示例,显示10分钟缩短为1秒(来自主页上的新闻).这就像是分配给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 )
Run Code Online (Sandbox Code Playgroud)

:=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
Run Code Online (Sandbox Code Playgroud)

并且:

DT[,newcol:=sum(v),by=group]  # like a fast transform() by group
Run Code Online (Sandbox Code Playgroud)

我想不出有任何理由要避免:=!除了,在for循环内.由于:=出现在里面DT[...],它带来了[.data.table方法的小开销; 例如,S3调度和检查的参数,如存在和类型i,by,nomatch等,所以里面的for循环,有一个低开销,直接版本的:=set.有关?set详细信息和示例,请参阅.setinclude 的缺点i必须是行号(没有二进制搜索),你不能将它与它结合起来by.通过制定这些限制set可以显着降低开销.

system.time(for (i in 1:1000) set(DT,i,"V1",i))
     user  system elapsed 
    0.016   0.000   0.018
Run Code Online (Sandbox Code Playgroud)

  • 感谢您开发此软件包.我有一种感觉,我将修改我的代码******以使用此包. (25认同)
  • @MatthewDowle想要包含何时不使用的解释:=并使用set()代替? (4认同)
  • @jabberwocky没问题.`set(DT,i,"V1",i)`设置`"V1"`列,而set(DT,i,colVar,i)`设置`colVar`变量中包含的列名(例如,如果` colVar ="V1"`之前完成了).引号表示从字面上取列名而不是查找变量. (3认同)
  • @MatthewDowle如果可以,我会再次+1. (2认同)