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 调度并检查参数的存在和类型,例如 i
、by
、nomatch
等。因此对于内部 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/