聚合方法以不同方式处理缺失值 (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
方法按组(“名称”)使用aggregate
到sum
变量时:
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)的主要内容,如果未能解决你的问题,请参考以下文章