2013-10-24 67 views
6

我一直在使用ddply從plyr包下面的代碼:相當於ddply(...,變換,...​​)在data.table

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給我只有三列缸,頻率和金額。好吧,我可以這樣做:

DT[,list(freq=.N,sum=sum(mpg),mpg,disp,hp,drat,wt,qsec,vs,am,gear,carb),by=cyl] 

但是,我有我讀出的數據大量的變量,我希望所有的人都在那裏爲ddply(...transform....)。在data.table中是否有快捷方式,就像:=當我們只有一個功能(如上)或data.table內的paste(names(mtcars),collapse=",")? 注:我也有大量的功能運行。所以,我不能多次重複=:(但是如果lapply可以在這裏應用,我更喜歡這個)。

+5

如果你只是想增加一列,我相信最好相當於'ddply'語法像''DT [,':='(freq = .N,sum = sum(mpg))]'' –

+0

謝謝@藍色魔導師 – Metrics

回答

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 
+0

謝謝@ Simon0101。 – Metrics

2

也有用在某些情況下:

newvars <- c("freq","sum") 
DT[, `:=`(eval(newvars), list(.N,sum(mpg)))] 
+0

你可能也會考慮'get'或'mget',而不是'eval'。 (未經測試)''DT [,':='(mget(newvars),list(.N,sum(mpg)))]''' –