如何在R中基于两个分组列聚合二元因子并补全零值分组?
R语言分组聚合二元因子列并保留0计数的解决方法
需求:以Group1和Group2为分组列,聚合二元因子列Result(取值为Success/Failure)的计数,同时保留某一结果计数为0的分组组合。
示例数据:
dat <- data.frame( Group1 = c("A", "A", "A", "B", "B", "C", "C", "C"), Group2 = c("D", "D", "D", "E", "E", "F", "F", "F"), Result = c("Success", "Success", "Fail", "Success", "Success", "Success", "Fail", "Fail") )
你之前使用的aggregate(Result ~ Group1 + Group2, data = dat, FUN=length)只能统计每组的总样本量,无法拆分Result的两类取值计数,以下是几种可行的解决方法:
方法一:dplyr + tidyr(推荐,语法直观)
需要先加载dplyr和tidyr包,通过分组计数再转宽格式实现,同时自动填充0值:
library(dplyr) library(tidyr) dat %>% count(Group1, Group2, Result) %>% pivot_wider(names_from = Result, values_from = n, values_fill = 0)
运行后会得到你期望的结果:
# A tibble: 3 × 4 Group1 Group2 Success Fail <chr> <chr> <int> <int> 1 A D 2 1 2 B E 2 0 3 C F 1 2
方法二:基础R实现(无需额外包)
利用table生成包含所有组合的交叉表,再转成宽格式数据框:
# 生成包含所有分组-结果组合的交叉表 count_tab <- with(dat, table(Group1, Group2, Result)) # 转换为数据框 count_df <- as.data.frame(count_tab) # 转宽格式 result_df <- reshape(count_df, idvar = c("Group1", "Group2"), timevar = "Result", direction = "wide") # 重命名列名(可选,让列名更简洁) colnames(result_df) <- gsub("Freq.", "", colnames(result_df))
最终result_df的输出格式与期望一致。
方法三:aggregate结合自定义函数
通过自定义函数在aggregate中直接统计两类结果的数量,再转换为数据框:
agg_result <- aggregate(Result ~ Group1 + Group2, data = dat, FUN = function(x) c(Success = sum(x == "Success"), Fail = sum(x == "Fail"))) # 将聚合结果展开为标准数据框 final_df <- do.call(data.frame, agg_result)
这种方法无需额外包,适合习惯基础R语法的场景。
内容的提问来源于stack exchange,提问作者GML0011
相关产品推荐
相关产品推荐

