【发布时间】:2015-11-13 22:00:56
【问题描述】:
我的数据框有两列用作分组键,每组有 17 列需要求和,还有一列应该取平均值。让我在不同的数据帧上说明这一点,diamonds 和 ggplot2。
我知道我可以这样做:
ddply(diamonds, ~cut, summarise, x=sum(x), y=sum(y), z=sum(z), price=mean(price))
但是,虽然 3 列是合理的,但其中 17 列是不可接受的。
在研究这个时,我发现了colwise 函数,但我想出的最好的是:
cbind(ddply(diamonds, ~cut, colwise(sum, 7:9)), price=ddply(diamonds, ~cut, summarise, mean(price))[,2])
是否有可能进一步改进这一点?我想以更直接的方式来做,比如(想象的命令):
ddply(diamonds, ~cut, colwise(sum, 7:9), price=mean(price))
或:
ddply(diamonds, ~cut, colwise(sum, 7:9), colwise(mean, ~price))
总结一下:
- 我不想像第一个示例中的
x、y和z一样,明确键入所有 17 列。 - 理想情况下,我希望通过一次调用
ddply来完成此操作,而不像第二个示例中那样诉诸cbind(或类似函数)。
作为参考,我期望的结果是 5 行 5 列:
cut x y z price
1 Fair 10057.50 9954.07 6412.26 4358.758
2 Good 28645.08 28703.75 17855.42 3928.864
3 Very Good 69359.09 69713.45 43009.52 3981.760
4 Premium 82385.88 81985.82 50297.49 4584.258
5 Ideal 118691.07 118963.24 73304.61 3457.542
【问题讨论】:
-
如果你使用的是
dplyr,也许是diamonds %>% group_by(cut) %>% mutate(MeanPrice=mean(price)) %>% mutate_each(funs(sum), 7:9) %>% select(c(2,7:11)) %>% unique()