NA值和R聚合函数

Rya*_*ker 41 aggregate r

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

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

当我以这种方式将聚合应用于M时:

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

结果是:

RowName Col1 Col2
name    1    1
Run Code Online (Sandbox Code Playgroud)

因此忽略整个第一行.但如果我这样做

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

结果是

Group.1 Col1 Col2
name    1    2
Run Code Online (Sandbox Code Playgroud)

因此只忽略(1,1)条目.

这引起了我的一个代码中的主要调试问题,因为我认为这两个调用是等效的.是否有充分的理由为什么"公式"输入方法被区别对待?

谢谢.

A5C*_*2T1 50

很好的问题,但在我看来,这不应该引起一个重大的调试问题,因为它在手册页的多个地方都有相当清楚的记录aggregate.

首先,在使用部分:

## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
          subset, na.action = na.omit)
Run Code Online (Sandbox Code Playgroud)

后来,在描述中:

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


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

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

  • @eddi - 听起来你实际上*喜欢关注`aggregate.formula`的作者;)但是,鉴于方法有时会使用不一致的默认值,除了手册*应该*它们应该记录在哪里?Ananda评论的正面价值在于它提醒OP(以及其他人),在我们这个不一致的世界中,**阅读手册可以节省头痛**! (7认同)
  • -1表示第一句话(确定你现在看起来很容易知道你正在寻找什么,但这对于找到irl来说是非常重要的) (6认同)
  • @eddi - 真的,这是一个downvote ?? 我认为Ananda在那里值得一提......仔细阅读帮助文档,尽早学习,这是一个非常好的学习习惯,并且会挽回许多令人头痛的问题! (4认同)
  • @JoshO'Brien 我真的会:) Anando 因为支持他们的不良行为而得到了它。我之所以对这个答案投反对票,是因为虽然“阅读手册*可以*减轻头痛”是事实,但我很难想象在这里会发生什么。您意识到这个特定问题的方式可能是通过痛苦而不是通过阅读手册。当然,您*可以*稍后使用该手册来确认您的痛苦来源,但是该手册应该被视为行为不良的孩子,而不是某种值得崇拜的圣经。/无意义的比较结束 (4认同)
  • @eddi,没问题.我从您的聊天和评论历史中了解到,您希望函数像您希望的那样工作而不是如何记录,并且您完全乐于接受这种观点. (3认同)
  • @AnandaMahto - 哈哈,相反,我喜欢函数在不同的用例中保持一致;但我对上面的 -1 进行了更多详细说明 - 它更多地与您认为这很容易找到有关,只是因为手册中提到了这种(再次,不一致的)行为 (3认同)
  • FWIW,当_I_读取引用的文档时,我会将其解释为仅删除NA值,而不是有_any_NA的整行.也许更有经验的R用户会发现它很明显,但我没有.所有真正需要说的是使用`na.action = na.pass`.这是我正在寻找的解决方案(与提问者类似的情况). (2认同)
  • 我可以补充一点,文档不太好吗?我读完之后才到这里。功能是什么很清楚,但是有哪些选项呢?na.action = na.omit 返回给我“无效的参数‘类型’(闭包)”。是否有任何地方有关于aggregate或na.omit的正确文档可以很好地解释其用法?非常感谢任何线索... (2认同)

pic*_*ick 17

如果您希望公式版本相同,请尝试以下方法:

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)
Run Code Online (Sandbox Code Playgroud)

  • +1,但不需要匿名函数:`aggregate(.~Name,M,FUN = sum,na.rm = TRUE,na.action ="na.pass")`也有效. (4认同)
  • 感谢您指出“na.pass”。这比“NULL”更清晰一些(尽管两者似乎都有效)。 (2认同)