【问题标题】:Aggregate with na.action=na.pass gives unexpected answer与 na.action=na.pass 聚合给出了意想不到的答案
【发布时间】:2016-02-20 09:55:40
【问题描述】:

我以下面的data.frame为例:

d <- data.frame(x=c(1,NA), y=c(2,3))

我想用变量 x 来总结 y 的值。由于 x 没有共同的值,我希望聚合只给我原始的 data.frame,其中 NA 被视为一个组。但是聚合给了我以下结果。

>aggregate(y ~ x, data=d, FUN=sum)
  x y
1 1 2

我已阅读有关更改 na.action 的默认操作的文档,但它似乎没有给我任何有意义的东西。

>aggregate(y ~ x, data=d, FUN=sum, na.action=na.pass)
  x y
1 1 2

发生了什么事?在这种情况下,我似乎不明白 na.pass 在做什么。是否可以选择在 R 中完成我想要的?任何帮助将不胜感激。

【问题讨论】:

  • 您是说您正在考虑将NA 值作为分组变量?你想要NA吗? (不清楚,因为您也在使用 na.rm = TRUE 作为测试的一部分......
  • 是的,我希望 NA 作为一个组。
  • 文档说“在任何 by 变量中缺少值的行都将从结果中省略。”如果您不希望这样,您需要重新编码您的 by 变量或使用不同的函数进行聚合。

标签: r aggregate na


【解决方案1】:

aggregate 使用 tapply,而 tapply 又在其分组变量上使用 factor

但是,看看factor 中的NA 值会发生什么情况:

factor(c(1, 2, NA))
# [1] 1    2    <NA>
# Levels: 1 2

注意levels。您可以使用addNA 来保留NA

addNA(factor(c(1, 2, NA)))
# [1] 1    2    <NA>
# Levels: 1 2 <NA>

因此,您可能需要执行以下操作:

aggregate(y ~ addNA(x), d, sum)
#   addNA(x) y
# 1        1 2
# 2     <NA> 3

或者类似的东西:

d$x <- addNA(factor(d$x))
str(d)
# 'data.frame': 2 obs. of  2 variables:
#  $ x: Factor w/ 2 levels "1",NA: 1 2
#  $ y: num  2 3
aggregate(y ~ x, d, sum)
#      x y
# 1    1 2
# 2 <NA> 3

(或者,升级到“data.table”之类的东西,它不仅比aggregate 更快,而且还可以让您的行为与NA 值更加一致。无需注意不管你是using the formula method of aggregate or not。)

library(data.table)
as.data.table(d)[, sum(y), by = x]
#     x V1
# 1:  1  2
# 2: NA  3

【讨论】:

  • 谢谢,非常感谢。我对 na.pass 的功能很好奇。文档说它“原封不动地返回对象”。那么为什么 NA 似乎被移除了呢?
  • @Sanias,指的是要聚合的列,而不是“by”列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 2015-07-13
  • 2019-06-30
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多