下面是一个例子,显示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调度并判断参数的存在和类型,如i
、by
、nomatch
等.因此,对于内部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