【问题标题】:Equivalent to ddply(...,transform,...) in data.table相当于 data.table 中的 ddply(...,transform,...)
【发布时间】:2013-11-03 08:24:07
【问题描述】:

我使用 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 中是否有捷径,就像在 data.table 中只有一个函数(如上)或类似 paste(names(mtcars),collapse=",") 时执行 := 一样? 注意:我还有大量函数要运行。所以,我不能多次重复=:(但如果可以在这里应用lapply,我会更喜欢这个)。

【问题讨论】:

  • 如果您只是想添加列,我相信与ddply 等效的最佳语法类似于DT[,`:=`(freq = .N, sum = sum(mpg))]
  • 谢谢@Blue Magister

标签: r transform data.table plyr


【解决方案1】:

像这样使用反引号:=...

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

【讨论】:

    【解决方案2】:

    在某些情况下也很有用:

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

    【讨论】:

    • 你也可以考虑使用 'get' 或 'mget' 而不是 'eval',例如(未经测试)DT[, `:=`(mget(newvars), list(.N,sum(mpg)))]
    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2022-01-06
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多