宽格式数据框按组统计分类数据频率及可视化需求
患者数据分组统计与比例对比实现方案
问题分析
你之前的代码错误在于连续两次group_by会覆盖前一次分组,导致无法同时按组和变量统计,且未区分Yes/No状态的计数。以下是完整实现步骤:
1. 加载依赖包与数据准备
library(tidyverse) # 生成可复现的模拟数据集 set.seed(123) group <- sample(c("group 1", "group 2"), 100, replace = TRUE) gender <- sample(c("Male", "Female"), 100, replace = TRUE) medication_1 <- sample(c("Yes", "No"), 100, replace=TRUE) medication_2 <- sample(c("Yes", "No"), 100, replace=TRUE) comorbidity_1 <-sample(c("Yes", "No"), 100, replace=TRUE) comorbidity_2 <-sample(c("Yes", "No"), 100, replace=TRUE) df <- data.frame(group, gender, medication_1, medication_2, comorbidity_1, comorbidity_2)
2. 宽转长与统计计数/比例
用tidyr::pivot_longer替代reshape::melt,适配tidyverse工作流,同时完成正确的分组统计:
# 将宽格式数据转为长格式 df_long <- df %>% pivot_longer(cols = -group, names_to = "variable", values_to = "status") # 统计分组-变量-状态的计数,再计算组内比例 summary_df <- df_long %>% group_by(group, variable, status) %>% summarise(count = n(), .groups = "drop") %>% group_by(group, variable) %>% mutate(prop = count / sum(count)) %>% ungroup()
3. 生成按组拆分的计数表格
将统计结果转为宽格式,得到直观的分组计数对比表:
count_table <- summary_df %>% select(-prop) %>% pivot_wider(names_from = c(group, status), values_from = count, values_fill = 0) # 查看最终计数表格 print(count_table)
4. 绘制组间比例对比图
参考目标风格,绘制分组条形图展示各变量的Yes占比:
# 筛选出Yes状态的比例数据 yes_prop_df <- summary_df %>% filter(status == "Yes") # 生成比例对比图 ggplot(yes_prop_df, aes(x = variable, y = prop, fill = group)) + geom_col(position = position_dodge(width = 0.8), width = 0.7) + # 添加百分比标签 geom_text(aes(label = scales::percent(prop, accuracy = 1)), position = position_dodge(width = 0.8), vjust = -0.3, size = 3.5) + # 设置y轴为百分比格式 scale_y_continuous(labels = scales::percent_format(), limits = c(0, 1)) + # 设置图表标题与标签 labs(title = "用药与合并症组间比例对比", x = "变量类型", y = "占比", fill = "患者分组") + # 优化主题样式 theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5))
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

