r - 我什么时候应该使用 := operator in data. 表?

标签 r data.table colon-equals

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 方法的少量开销;例如,S3 调度并检查参数的存在和类型,例如 ibynomatch 等。因此对于内部 for 循环中,有一个低开销、直接的 := 版本,称为 set。请参阅 ?set 了解更多详细信息和示例。 set 的缺点包括 i 必须是行号(无二分搜索),并且不能将其与 by 组合。通过设置这些限制可以显着减少开销。

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

关于r - 我什么时候应该使用 := operator in data. 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029944/

相关文章:

r - data.table 中 mutate_at (dplyr) 的等价物是什么?

r - 使用 := in data. 表按组分配多列

r - x 轴的斜体标签

r - 为函数 "method with signature ‘Timespan#Timespan’“选择的润滑注释 ‘%/%’是什么意思?

r - 将对象名称传递给 do.call() 函数

mysql - = 和 := in MySQL? 有什么区别

vb.net - := mean in VB? 是什么

r - 计算行的平均值,排除每行中的最高值和最低值

r - 如何按键重新创建表?

r - 将表作为函数参数和值传递