使用 ddply 计算 R 中的总和和平均值

2024-04-17

我的数据框有两列用作分组键,每组有 17 列需要求和,还有一列应该进行平均。让我在不同的数据框架上说明这一点,diamonds from 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))

or:

ddply(diamonds, ~cut, colwise(sum, 7:9), colwise(mean, ~price))

总结:

  • 我不想像第一个示例那样显式键入所有 17 列x, y, and z.
  • 理想情况下,我想通过一次调用来完成此操作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

我想建议data.table对此的解决方案。您可以轻松地按位置或名称预定义要操作的列,然后无论要操作多少列,都可以重复使用相同的代码。

预定义的列名称

Sums <- 7:9
Means <- "price"

运行代码

library(data.table)
data.table(diamonds)[, c(lapply(.SD[, Sums, with = FALSE], sum),
                         lapply(.SD[, Means, with = FALSE], mean))
                     , by = cut]

#          cut         x         y        z    price
# 1:     Ideal 118691.07 118963.24 73304.61 3457.542
# 2:   Premium  82385.88  81985.82 50297.49 4584.258
# 3:      Good  28645.08  28703.75 17855.42 3928.864
# 4: Very Good  69359.09  69713.45 43009.52 3981.760
# 5:      Fair  10057.50   9954.07  6412.26 4358.758

对于您的具体示例,这可以简化为

data.table(diamonds)[, c(lapply(.SD[, 7:9, with = FALSE], sum), pe = mean(price)), by = cut]
#          cut         x         y        z       pe
# 1:     Ideal 118691.07 118963.24 73304.61 3457.542
# 2:   Premium  82385.88  81985.82 50297.49 4584.258
# 3:      Good  28645.08  28703.75 17855.42 3928.864
# 4: Very Good  69359.09  69713.45 43009.52 3981.760
# 5:      Fair  10057.50   9954.07  6412.26 4358.758
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ddply 计算 R 中的总和和平均值 的相关文章

随机推荐