【问题标题】:How to calculate the mean in a data frame using aggregate function in R?如何使用 R 中的聚合函数计算数据框中的平均值?
【发布时间】:2015-08-04 18:34:44
【问题描述】:

我有一个数据框 df1:

number=c(4,3,2,3,4,1)
year=c("2000","2000","2000", "2015", "2015", "2015")
items=c(12, 10, 15, 5, 10, 7)
df1=data.frame(number, year, items)
setDT(df1)[, Prop := number/sum(number), by = year]

看起来像这样:

  number year items      Prop
1:      4 2000    12 0.4444444
2:      3 2000    10 0.3333333
3:      2 2000    15 0.2222222
4:      3 2015     5 0.3750000
5:      4 2015    10 0.5000000
6:      1 2015     7 0.1250000

我想得到每年项目数量的平均值,所以我尝试使用这个函数:

mean.df1=aggregate((df1$number*df1$Prop),list(df1$year), mean)

但它返回了错误的平均值。我希望它返回:

  Group.1        x
1    2000 2.918918
2    2015 2.296296

其中 Group.1 是年份,x 是正确的平均值。

谢谢!

【问题讨论】:

  • 只是df1[, mean(number*Prop), by = year]?为什么首先在这里使用aggregateaggregate 语法对您来说是否比 data.table 的一些简单击键更有意义?
  • 您是如何获得这些结果的? 2000年平均每年2.918918的物品数量是多少??
  • 考虑将您想要的输出与给定的数据相匹配,以减少混淆。

标签: r aggregate


【解决方案1】:

aggregate 平均项目数/年

aggregate(number ~ year, data=df1, mean)
#   year   number
# 1 2000 3.000000
# 2 2015 2.666667

编辑

对于基础 R 中的加权平均值,您可以执行标准的拆分-应用-组合

sapply(split(df1, df1$year), function(x) weighted.mean(x$number, w=x$items))

sapply(split(df1, df1$year), function(x) sum(x$number*x$items)/sum(x$items))
#     2000     2015 
# 2.918919 2.818182 

【讨论】:

  • 没有得到预期的输出\
  • @SeñorO 所需的输出与给定的输入不匹配。
  • 您实际上不必使用公式。 OPs 方法将与您的 aggregate(df1$number,list(df1$year), mean) 给出相同的结果
  • 但是“可读性”如何回答这个问题? OP 提供了一个他声称不起作用的工作代码,而您提供了具有更易读代码的相同解决方案。怎么解决?
  • 您的解决方案没有考虑对 OP 来说至关重要的比例部分(加权平均值)。所以这可能是更糟糕的解决方案
【解决方案2】:

使用dplyr 包怎么样

library(dplyr)
df1  %>% group_by(year) %>% summarise(mean = sum(number * items)/sum(items))

给了

  year     mean
1 2000 2.918919
2 2015 2.818182

【讨论】:

    【解决方案3】:

    我只需要在我的聚合函数中将“mean”切换为“sum”,这样它就变成了:

    mean.df1=aggregate((df1$number*df1$Prop),list(df1$year), sum)
    

    【讨论】:

    • 再一次,你有一个data.table 对象。你为什么使用aggregate?为什么不只是df1[, sum(number*Prop), by = year]
    猜你喜欢
    • 2020-12-16
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2012-10-11
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多