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

如何在R中合并多分类变量的独立分组汇总操作以得到一致结果?

合并分类变量按组统计频数与占比的解决方案

你需要将两段分别针对category1和category2、按group统计频数与占比的dplyr代码合并,但尝试的合并代码结果不符合预期,期望得到各分类变量独立按group统计的汇总表。

现有数据集与原独立统计代码

library(dplyr)
data = data.frame(
  group = c("A", "A", "A", "B","B"),
  category1 = c("X", "Y", "Z", "Z", "X"),
  category2 = c("M", "Q", "M", "M", "L")
)

# 按group统计category1的频数与占比
data %>% group_by(group, category1) %>% summarize(count = n()) %>% ungroup() %>%
  group_by(group) %>%
  mutate(percent = count/sum(count)*100)

# 按group统计category2的频数与占比
data %>% group_by(group, category2) %>% summarize(count = n()) %>% ungroup() %>%
  group_by(group) %>%
  mutate(percent = count/sum(count)*100)

你尝试的错误合并代码

你的错误代码同时按category1和category2交叉分组,统计的是两个分类组合后的频数,占比计算也是基于交叉组的总数,并非两个分类各自独立的统计结果:

data %>% group_by(group, category1, category2) %>% summarize(count = n()) %>% ungroup() %>%
  group_by(group) %>%
  mutate(percent = count/sum(count)*100)

正确的合并实现方法

方法1:数据重塑为长格式(推荐)

通过pivot_longer将两个分类变量转为长格式,再统一分组统计,一次性得到两个分类的结果:

library(tidyr) # 需要加载tidyr包用于pivot_longer

data %>%
  # 将category1和category2转为长格式,区分分类类型和取值
  pivot_longer(cols = starts_with("category"), 
               names_to = "category_type", 
               values_to = "category_value") %>%
  # 按组、分类类型、分类值统计频数
  group_by(group, category_type, category_value) %>%
  summarize(count = n(), .groups = "drop_last") %>%
  # 按组和分类类型计算占比
  mutate(percent = count/sum(count)*100) %>%
  ungroup()

运行后会得到包含group、category_type(标记是category1还是category2)、category_value(分类具体取值)、count(频数)、percent(占比)的汇总表,完全整合了原两段代码的统计逻辑。

方法2:分别统计后合并

如果偏好先单独统计再合并的方式,可以给每个统计结果加类型标记后用bind_rows合并:

# 统计category1并标记类型
stat_cat1 <- data %>% 
  group_by(group, category1) %>% 
  summarize(count = n(), .groups = "drop_last") %>%
  mutate(percent = count/sum(count)*100,
         category_type = "category1") %>%
  rename(category_value = category1) %>%
  ungroup()

# 统计category2并标记类型
stat_cat2 <- data %>% 
  group_by(group, category2) %>% 
  summarize(count = n(), .groups = "drop_last") %>%
  mutate(percent = count/sum(count)*100,
         category_type = "category2") %>%
  rename(category_value = category2) %>%
  ungroup()

# 合并结果
combined_stat <- bind_rows(stat_cat1, stat_cat2)

内容的提问来源于stack exchange,提问作者bvowe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:26:24