我使用plyr包中的ddply
代码如下:
ddply(mtcars,.(cyl),transform,freq=length(cyl))
data.table版本是:
DT<-data.table(mtcars)
DT[,freq:=.N,by=cyl]
如果我有多个功能,如下所示,我该如何扩展呢?
现在,我想在ddply
和data.table
上执行多个功能:
ddply(mtcars,.(cyl),transform,freq=length(cyl),sum=sum(mpg))
DT[,list(freq=.N,sum=sum(mpg)),by=cyl]
但是,data.table
只给我三列cyl,freq和sum。好吧,我可以这样做:
DT[,list(freq=.N,sum=sum(mpg),mpg,disp,hp,drat,wt,qsec,vs,am,gear,carb),by=cyl]
但是,我的阅读数据中有大量变量,我希望它们都像ddply(...transform....)
一样存在。 data.table
中是否有快捷方式,就像:=
只有一个函数(如上所述)或paste(names(mtcars),collapse=",")
中的data.table
一样?
注意:我还有很多要运行的功能。所以,我不能多次重复=:
(但如果lapply
可以在这里应用,我会更喜欢这个)。
答案 0 :(得分:10)
像这样使用反引号:=
......
DT[ , `:=`( freq = .N , sum = sum(mpg) ) , by=cyl ]
head( DT , 3 )
# mpg cyl disp hp drat wt qsec vs am gear carb freq sum
#1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 7 138.2
#2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 7 138.2
#3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 11 293.3
答案 1 :(得分:2)
在某些情况下也很有用:
newvars <- c("freq","sum")
DT[, `:=`(eval(newvars), list(.N,sum(mpg)))]