如何在R中处理多选项问卷数据并生成分组对比饼图
多选项问卷分组占比饼图解决方案
问题背景
现有包含多选项问卷(Q1-Q4)的数据集,需对比确诊(diagnosis=yes)与未确诊(diagnosis=no)人群的**所有答案组合(含多选项)**占比,但原有代码仅统计单个选项,丢失了多选项组合的统计结果。
解决步骤与代码
1. 数据预处理与格式转换
先将宽格式数据转为长格式,同时处理字符串型"NA"为R原生缺失值,过滤无效缺失数据:
library(tidyverse) # 加载原始数据 diagnosis <- c("yes", "no", "yes", "yes", "yes", "no", "yes", "no", "no", "no") Q1 <- c("A","NA","A,B",NA,"NA","C,D,A","D","A","B,C,A", "NA") Q2 <- c("D","NA","D,A,B","C","NA",NA,"A,B,C","A","A","A") Q3 <- c("B","B,D","C,A,D","A",NA,"A","B,D,A","D","B","NA") Q4 <- c("B","NA","C","C","C,A","C,B","D","B",NA,"A,B,D") df <- data.frame(diagnosis, Q1,Q2,Q3,Q4) # 宽转长+清理无效值 df_long <- df %>% pivot_longer(cols = starts_with("Q"), names_to = "Question", values_to = "Answer") %>% mutate(Answer = ifelse(Answer == "NA", NA, Answer)) %>% # 转换字符串"NA"为缺失值 filter(!is.na(Answer)) # 过滤缺失的答案
2. 定义包含所有答案组合的因子水平
提取数据中实际出现的所有答案组合(包括多选项)作为因子水平,确保统计时不丢失任何组合:
# 获取所有唯一的答案组合 all_answer_combinations <- unique(df_long$Answer) df_long <- df_long %>% mutate(Answer = factor(Answer, levels = all_answer_combinations))
3. 分组统计占比
按diagnosis和Question分组,统计每个答案组合的频数与占比:
df_summary <- df_long %>% group_by(diagnosis, Question, Answer) %>% summarise(count = n(), .groups = "drop") %>% group_by(diagnosis, Question) %>% mutate(percentage = count / sum(count) * 100) %>% # 计算组内占比 ungroup()
4. 生成分组对比饼图
使用ggplot2生成分面饼图,直观对比不同人群的答案组合占比:
ggplot(df_summary, aes(x = "", y = percentage, fill = Answer)) + geom_bar(stat = "identity", width = 1) + coord_polar("y", start = 0) + # 转为饼图 facet_grid(diagnosis ~ Question) + # 按人群和问题分面 theme_void() + # 移除多余坐标轴 labs(title = "确诊与未确诊人群的问卷答案组合占比", fill = "答案组合") + geom_text(aes(label = sprintf("%.1f%%", percentage)), position = position_stack(vjust = 0.5)) # 添加百分比标签
关键说明
- 处理字符串"NA":原始数据中部分"NA"是字符串类型,需转换为R原生缺失值
NA,否则会被误统计为有效答案。 - 动态因子水平:通过
unique()获取实际存在的所有答案组合,避免手动指定因子水平导致的遗漏。 - 组内占比计算:确保每个
diagnosis+Question分组内的占比总和为100%,符合饼图的统计逻辑。
内容的提问来源于stack exchange,提问作者dplyr
相关产品推荐
相关产品推荐

