聚合方法以不同方式处理缺失值 (NA)

Posted

技术标签:

【中文标题】聚合方法以不同方式处理缺失值 (NA)【英文标题】:aggregate methods treat missing values (NA) differently 【发布时间】:2013-05-26 12:38:54 【问题描述】:

这是一个缺少值的简单数据框:

M = data.frame( Name = c('name', 'name'), Col1 = c(NA, 1) , Col2 = c(1, 1))
#   Name Col1 Col2
# 1 name   NA    1
# 2 name    1    1

当我使用formula 方法按组(“名称”)使用aggregatesum 变量时:

aggregate(. ~ Name, M, FUN = sum, na.rm = TRUE)

结果是:

# RowName Col1 Col2
#    name    1    1

因此,具有NA 的整个第一行将被忽略。但是如果使用“非formula”规范:

aggregate(M[, 2:3], by = list(M$Name), FUN = sum, na.rm = TRUE)

结果是:

# Group.1 Col1 Col2
#    name    1    2

这里只忽略 (1,1) 条目。

这在我的一个代码中引起了严重的调试问题,因为我认为这两个调用是等效的。 formula 入口方法被区别对待是否有充分的理由?

谢谢。

【问题讨论】:

【参考方案1】:

如果您希望公式版本等效,请尝试以下操作:

M = data.frame( Name = rep('name',5), Col1 = c(NA,rep(1,4)) , Col2 = rep(1,5))
aggregate(. ~ Name, M, function(x) sum(x, na.rm=TRUE), na.action = na.pass)

【讨论】:

+1,但不需要匿名函数:aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action="na.pass") 也可以。 感谢您指出na.pass。这比NULL 更清楚一点(尽管两者似乎都有效)。【参考方案2】:

好问题,但在我看来,这不应该引起主要调试头痛,因为它在aggregate 的手册页的多个地方都清楚地记录了下来。

首先,在用法部分:

## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
          subset, na.action = na.omit)

稍后,在描述中:

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


我无法回答为什么公式模式的写法不同——这是函数作者必须回答的问题——但使用上述信息,您可能可以使用以下内容:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
#   Name Col1 Col2
# 1 name    1    2

【讨论】:

-1 表示第一句(确保它看起来很容易,因为您确切知道要查找的内容,但是要找到 irl 并不是一件容易的事) @eddi,没问题。我从您的聊天和评论历史中知道,您喜欢功能按您希望的方式工作,而不是它们的记录方式,您完全愿意接受这种观点。 @eddi -- 真的,对此表示反对?我认为 Ananda 提出了一个有价值的观点... 早晚仔细阅读帮助文档是一个非常好的学习习惯,并且会在以后省去很多麻烦! @eddi -- 听起来你实际上喜欢否决aggregate.formula 的作者;) 但是,考虑到方法有时确实使用不一致的默认值,除了手册应该将它们记录在案? Ananda 评论的积极价值在于它提醒 OP(和其他人),在我们这个不一致的世界中,阅读手册可以省去头痛 FWIW,当 I 阅读引用的文档时,我会将其解释为仅删除 NA 值,而不是删除有 any 的整行i> NA。也许一个更有经验的 R 用户会发现它很明显,但我没有。真正有必要说的是使用na.action=na.pass。这就是我正在寻找的解决方案(在与提问者类似的情况下)。

以上是关于聚合方法以不同方式处理缺失值 (NA)的主要内容,如果未能解决你的问题,请参考以下文章

R语言-缺失值判断以及处理

数据缺失处理(pandas)

Weka 决策树预测 NA 对缺失值的处理

R语言缺失值的处理——回归预测法

使用dplyr将多个值设置为NA

R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值