You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 09:40:29