R语言aggregate()函数如何保留含NA的分组行?
解决R语言aggregate()保留NA分组的问题
1. 创建测试数据框
FOO_BAR <- data.frame( Foo = c("A", "A", NA, "B", NA, "B"), Bar = c(1, 2, 3, 4, 5, 6), stringsAsFactors = FALSE )
2. 问题重现(默认聚合丢失NA分组)
默认情况下,aggregate()会自动剔除分组项为NA的行:
# 常规聚合结果无NA分组 aggregate(Bar ~ Foo, data = FOO_BAR, FUN = sum)
输出:
Foo Bar 1 A 3 2 B 10
3. 正确解决方案
场景1:分组变量为字符型
直接指定na.action = na.pass即可保留NA分组:
aggregate(Bar ~ Foo, data = FOO_BAR, FUN = sum, na.action = na.pass)
输出(包含NA分组):
Foo Bar 1 A 3 2 B 10 3 <NA> 8
场景2:分组变量为因子型
因子默认会排除NA作为合法水平,需先将NA纳入因子水平,再执行聚合:
# 将NA加入Foo的因子水平 FOO_BAR$Foo <- factor(FOO_BAR$Foo, exclude = NULL) # 执行聚合 aggregate(Bar ~ Foo, data = FOO_BAR, FUN = sum, na.action = na.pass)
输出同样会包含NA分组的聚合结果。
关键说明
na.action = na.pass的作用是跳过NA的剔除逻辑,保留所有行参与分组计算。- 若分组变量是因子型,必须先通过
exclude = NULL把NA添加为因子水平,否则na.pass无法生效——因为因子本身不识别NA为合法分组项。
内容的提问来源于stack exchange,提问作者myt
相关产品推荐
相关产品推荐

