这是一个示例,显示 10 分钟缩短为 1 秒(摘自 NEWShomepage)。这就像子分配给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 )
把:=
in 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
and :
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
我想不出任何理由可以避免:=
!除了,在一个for
环形。自从:=
出现在里面DT[...]
,它的开销很小[.data.table
方法;例如,S3 调度并检查参数的存在和类型,例如i
, by
, nomatch
等等,所以对于内部for
循环,有一个低开销的直接版本:=
called set
. See ?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