聚合+平均值返回错误结果

3
使用 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 表示在组 1998 中,d 的平均值为 4.62,但实际上是 4.5。

将数据缩减为仅一列后,aggregate 得到了正确结果:

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

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

1个回答

7

在将数据传递给平均数函数之前,聚合会取出包含任何列中的NAs的行。尝试在没有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) - thelatemail
这种方法还可以计算在一个组(例如时间范围)内具有数值的子集上的平均值、最大值、最小值等,忽略该组中为NA的数据。太棒了! - DirtStats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接