data.table
对象现在有一个 := 运算符。是什么让这个运算符与所有其他赋值运算符不同?另外,它的用途是什么,它的速度有多快,什么时候应该避免?
问问题
16694 次
1 回答
96
这是一个将 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 )
像这样:=
放入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
include的缺点i
必须是行号(没有二进制搜索),并且不能将它与by
. 通过制定这些限制set
可以显着减少开销。
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
于 2011-08-11T17:18:31.417 回答