如何调整R的aggregate函数,实现分组求和时保留非完整案例?
解决R中aggregate聚合时因缺失值排除整行的问题
你遇到的问题根源是aggregate函数默认使用na.action=na.omit参数,会先移除所有包含缺失值(NA)的整行,再执行聚合操作,最终导致求和结果不符合预期。
解决方案:调整参数让聚合忽略列级缺失值
只需修改两处设置即可实现需求:
- 设置
na.action=na.pass,保留所有含NA的行 - 在求和函数中加入
na.rm=TRUE,让sum计算时跳过NA值
具体代码如下:
v1 <- c(1, 1, 1, NA) v2 <- c(2, 2, NA, 2) v3 <- c("A", "B", "A", "B") df <- data.frame(v1, v2, v3) # 修改后的aggregate调用 aggregate(.~v3, data=df, FUN=function(x) sum(x, na.rm=TRUE), na.action=na.pass)
运行后输出:
v3 v1 v2 1 A 2 2 2 B 1 4
补充写法:指定聚合列而非公式语法
也可以不用公式形式,直接指定要聚合的列和分组变量,此时无需额外设置na.action,只需给sum添加na.rm=TRUE:
aggregate(df[, c("v1", "v2")], by=list(v3=df$v3), FUN=sum, na.rm=TRUE)
这个写法同样能得到你期望的结果。
原理说明
默认的na.omit会把第三行(v2为NA)和第四行(v1为NA)全部移除,导致分组后A组只剩第一行、B组只剩第二行。而na.pass会保留所有行,再对每组的每列单独执行带na.rm=TRUE的求和,这样就能正确计算每组中各列的非NA值总和。
内容的提问来源于stack exchange,提问作者Stephen Clark
相关产品推荐
相关产品推荐

