49

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

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

当我使用以下aggregate方法sum按组('名称')使用变量时formula

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输入方法被区别对待是否有充分的理由?

谢谢。

4

2 回答 2

61

好问题,但在我看来,这不应该引起严重的调试问题,因为它在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
于 2013-05-30T19:55:48.233 回答
19

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

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)
于 2013-05-30T20:02:19.800 回答