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

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分制被区别对待有什么好的理由吗?

谢谢

推荐答案

好问题,但在我看来,这不应该引起major调试的头痛,因为它在手册页面的多个地方都有很清楚的记录.

首先,在用法部分:

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

稍后,在描述中:

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


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

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

R相关问答推荐

R:如何在没有for循环的情况下替换多边形几何中的值?

使用lares::corr_var函数在for循环中分配变量的问题

如何将多个数据帧附加到R中的多个相应的CSV文件中?

在R中使用GG Plot时如何 suppress 等值线图中的彩色条

如何判断某列中由某些行组成的百分比

如何根据条件计算时差(天)

如何使用按钮切换轨迹?

如何从当前行上方找到符合特定条件的最接近值?

使用列/行匹配将两个不同维度的矩阵相加

多个模拟序列间的一种预测回归关系

使用data.table::fcase()而不是dplyr::case_When()时保持值

如何删除最后一个可操作对象

您是否可以折叠R中的重复行,同时保留基于所选列的值?

如何将SAS数据集的列名和列标签同时包含在r中GT表的表首?

函数可以跨多个列搜索多个字符串并创建二进制输出变量

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

是否从列中删除★符号?

如何使投篮在R中保持一致

每行不同列上的行求和