如何将列作为参数传递给ddply中的sum()?

时间:2015-01-04 06:48:20

标签: r plyr

我有一个数据框,其列名将在每次生成时更改,因此我想将列名称作为变量传递。假设这是我的数据帧的简化版本:

mydf<- data.frame(colors=c('Blue','Red','Green'), weight1=c(1:6),weight2=c(10:15))

如果列名称不是问题,则以下代码执行我想要的操作:

x<-ddply(mydf,'colors', summarize, sum(weight1))


  colors sum(weight1)
1   Blue            5
2  Green            9
3    Red            7

但是如果尝试将列weight1作为变量传递,它不再按组进行求和,而是返回批量总和。以下是我尝试过的几件事:

ddply(mydf,'colors', summarize, sum(mydf[2]))
  colors sum(mydf[2])
1   Blue           21
2  Green           21
3    Red           21


mycol <- colnames(mydf)[2]
ddply(Cars,'model', summarize, sum(get(mycol)))
Error: object 'weight1' not found

ddply(mydf,'colors', summarize, sum(eval(parse(text = mycol))))
Error: object 'weight1' not found

ddply(mydf,'colors', summarize, do.call('sum', mydf[2]))
colors do.call("sum", mydf[2])
1   Blue                      21
2  Green                      21
3    Red                      21

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试dplyr

library(dplyr)
library(lazyeval)
mydf %>% 
    group_by(colors) %>% 
   summarise_(sum_val=interp(~sum(var), var=as.name(mycol)))
#   colors sum_val
#1   Blue       5
#2  Green       9
#3    Red       7

或使用ddply

中的plyr
library(plyr)
ddply(mydf, .(colors), summarize,
   sum_val=eval(substitute(sum(var), list(var=as.name(mycol)))) )
#   colors sum_val
#1   Blue       5
#2  Green       9
#3    Red       7

关于其中一个代码中的错误,

ddply(Cars,'model', summarize, sum(get(mycol)))
#Error: object 'weight1' not found

未定义Cars对象,但以下内容适用于示例数据。

ddply(mydf,'colors', summarize, sum_val=sum(get(mycol)))
#  colors sum_val
#1   Blue       5
#2  Green       9
#3    Red       7