我的数据框有两列作为分组键,17列需要在每个组中求和,还有一列应该取平均值。让我用一个不同的数据框 diamonds
来说明。
我知道可以像这样做:
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()
- akrun