R语言按两个分类列聚合时如何保留含缺失值的所有分组组合
问题原因
R中aggregate函数使用公式(~)语法时,默认采用na.action = na.omit参数,会自动剔除分组列中包含缺失值(含空字符串、NA)的行,导致新增的Test行没有出现在聚合结果中。如果原数据集的分组列是因子类型,新增未在因子水平内的取值时,也会被自动转换为NA被剔除。
解决方法
方法1:使用非公式接口调用aggregate
显式通过by参数传入分组列,不会自动过滤分组列的任何取值:
aggregate(x = CO2[, c("Treatment", "conc", "uptake")], by = list(Plant = CO2$Plant, Type = CO2$Type), FUN = sum, na.rm = TRUE)
方法2:公式接口添加na.action参数
在原有公式写法的基础上,新增na.action = na.pass参数,关闭自动剔除含缺失值行的逻辑:
# 若分组列为因子类型,先转为字符型避免空值被转成NA CO2$Type <- as.character(CO2$Type) # 执行聚合 aggregate(. ~ Plant + Type, data = CO2, sum, na.rm = TRUE, na.action = na.pass)
两种方法执行后都会输出你期望的包含Plant为Test的13行聚合结果。
补充说明
如果需要保留两个分类列的所有理论组合(哪怕该组合没有对应原始数据),可以先通过expand.grid(Plant = unique(CO2$Plant), Type = unique(CO2$Type))生成全部分组,再和聚合结果做左连接补全即可。
内容的提问来源于stack exchange,提问作者Ilik
相关产品推荐
相关产品推荐

