data.table个对象现在有一个:=操作符.是什么使该运算符不同于所有其他赋值运算符?还有,它有什么用途,速度有多快,什么时候应该避免?

推荐答案

下面是一个例子,显示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方法的小开销;e、 例如,S3调度并判断参数的存在和类型,如ibynomatch等.因此,对于内部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

R相关问答推荐

如何使用行政边界形状文件中的人口普查数据调整格栅数据集中的人口数据

如果行和列名以相同的开头,将矩阵值设置为0

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

使用R的序列覆盖

R等效于LABpascal(n,1)不同的列符号

无法将传奇添加到cowplot多情节中

gt()从gt为相同内容的单元格 colored颜色 不同?

gganimate在使用shadow_mark选项时不保留所有过go 的标记

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

仅 Select 超过9行的CSV文件

如何在PackageStatus()中列出&q;不可用的包&q;?

有没有可能用shiny 的书签恢复手风琴面板?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

使用未知字符数(不受限制的最大长度)的Lookback有什么好的替代方案?

如何计算增加10米(0.01公里)的行?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

如何在shiny 的应用程序 map 视图宣传单中可视化单点

有没有办法更改ggplot2中第二个y轴的比例限制?