相当于data.table中的ddply(...,transform,...)

时间:2013-10-24 14:45:24

标签: r transform data.table plyr

我使用plyr包中的ddply代码如下:

ddply(mtcars,.(cyl),transform,freq=length(cyl))

data.table版本是:

DT<-data.table(mtcars)

DT[,freq:=.N,by=cyl]

如果我有多个功能,如下所示,我该如何扩展呢?

现在,我想在ddplydata.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可以在这里应用,我会更喜欢这个)。

2 个答案:

答案 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)))]