【问题标题】:aggregate + mean returns wrong result聚合 + 均值返回错误结果
【发布时间】:2015-10-03 19:20:38
【问题描述】:

使用 R,我将使用 aggregate(..., mean) 计算分组均值。然而,平均回报是错误的。

testdata <-read.table(text="
a  b    c   d   year
2   10  1   NA  1998
1   7   NA  NA  1998
4   6   NA  NA  1998
2   2   NA  NA  1998
4   3   2   1   1998
2   6   NA  NA  1998
3   NA  NA  NA  1998
2   7   NA  3   1998
1   8   NA  4   1998
2   7   2   5   1998
1   NA  NA  4   1998
2   5   NA  6   1998
2   4   NA  NA  1998
3   11  2   7   1998
1   18  4   10  1998
3   12  7   5   1998
2   17  NA  NA  1998
2   11  4   5   1998
1   3   1   1   1998
3   5   1   3   1998
",header=TRUE,sep="")
aggregate(. ~ year, testdata,
          function(x) c(mean = round(mean(x, na.rm=TRUE), 2)))
colMeans(subset(testdata, year=="1998", select=d), na.rm=TRUE)

aggregate 表示 d1998 的平均值是 4.62,但它是 4.5。

仅将数据减少到一列,aggregate 正确:

aggregate(. ~ year, test[4:5],
          function(x) c(mean = round(mean(x, na.rm=TRUE), 2)))

我的aggregate() + mean() 函数出了什么问题?

【问题讨论】:

    标签: r aggregate mean


    【解决方案1】:

    aggregate 在将任何列中包含 NA 的行传递给 mean 函数之前将其取出。尝试在没有 na.rm=TRUE 的情况下运行聚合调用 - 它仍然可以工作。

    要解决这个问题,您需要将默认的 na.action 更改为 na.pass:

    aggregate(. ~ year, testdata,
              function(x) c(mean = round(mean(x, na.rm=TRUE), 2)), na.action = na.pass)
    
    
      year    a    b    c   d
    1 1998 2.15 7.89 2.67 4.5
    

    【讨论】:

    • 不错。或者干脆跳过公式界面,也就是默认引入na.omit——aggregate(testdata[c("a","b","c","d")],testdata["year"],mean,na.rm=TRUE)
    • 这种方法还可以允许对具有数值的组(例如,时间范围)内的数据子集计算平均值、最大值、最小值等,而忽略该组中的数据不适用。太好了!
    猜你喜欢
    • 1970-01-01
    • 2019-07-20
    • 2021-02-03
    • 2018-09-05
    • 2020-04-26
    • 2018-02-23
    • 2018-06-20
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多