【问题标题】:Why does aggregate NOT ignore NA values as per documentation?为什么按照文档聚合不忽略 NA 值?
【发布时间】:2019-07-31 14:12:52
【问题描述】:

假设我有以下data.frame:

v <- data.frame(user=c("tom", "tom", "joe", "joe", "pat"), grade=c(70, NA, 80, 90, 100), stringsAsFactors = F)
v
  user grade
1  tom    70
2  tom    NA
3  joe    80
4  joe    90
5  pat   100

假设我想按用户聚合如下:

aggregate(v$grade, by=list(user = v$user), FUN=sum)
  user   x
1  joe 170
2  pat 100
3  tom  NA

我很困惑为什么“tom”以NA 出现,因为在aggregate? 的文档中它说:

na.action
一个函数,它指示数据时应该发生什么 包含 NA 值。默认是忽略缺失值 给定变量。

我是否误解了 na.action 的意思,因为它让我相信它应该忽略 NA 值?

【问题讨论】:

  • aggregate(v$grade, by=list(user = v$user), FUN=sum, na.rm = TRUE)
  • na.rm 不是此函数文档中列出的参数,但您的解决方案确实有效。什么给了?
  • 来自sum。有两个函数参数。 -1) 来自aggregate 本身发生na.action 的地方
  • 那么为什么na.action 不起作用?根据aggregate 的文档,函数:sum 永远不会看到NA
  • na.rm=TRUE 通过... 参数传递给FUN,所以你正在做sum(something, na.rm=TRUE)

标签: r dataframe aggregate


【解决方案1】:

您使用了错误的 S3 方法。默认方法没有na.action 参数。使用公式方法,里面有:

aggregate(grade ~ user, v, sum)
#  user grade
#1  joe   170
#2  pat   100
#3  tom    70

帮助页面上记录了 S3 方法及其参数。公式方法是唯一具有此参数的方法,据我所知,其他方法不会在内部调用它。

【讨论】:

  • 哦,。我明白了,我没有仔细阅读“使用”部分。我明白了,不同类的不同 S3 方法使用不同的参数。该死的,这令人困惑!
  • 如果您想按用户聚合 2 个字段,例如:low_grade 和 high_grade,聚合公式是什么。会是cbind(low_grade, high_grade) ~ user吗?是否有更多关于聚合公式的文档?
  • 与使用带有两个因变量的lm 时相同:cbind(low_grade, high_grade) ~ user
  • 顺便说一句,aggregate 不再使用太多,因为人们大多转而使用 dplyr 或 data.table 包进行聚合。
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2017-10-25
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
相关资源
最近更新 更多