如何将列作为参数传递给 ddply 中的 sum()?
How to pass columns as parameters to sum() in ddply?
我有一个数据框,其列名在每次生成时都会更改,因此我想将列名作为变量传递。假设这是我的数据框的简化版本:
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
作为变量传递,它不再按组求和,而是 returns 批量求和。以下是我尝试过的几件事:
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
有什么建议吗?
你可以试试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
或使用 plyr
中的 ddply
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
我有一个数据框,其列名在每次生成时都会更改,因此我想将列名作为变量传递。假设这是我的数据框的简化版本:
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
作为变量传递,它不再按组求和,而是 returns 批量求和。以下是我尝试过的几件事:
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
有什么建议吗?
你可以试试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
或使用 plyr
ddply
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