如何在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
相关产品推荐
相关产品推荐

