如何计算多选问卷中选某选项的受访者同时选其他选项的比例?
解决方案:基于Tidyverse的多选问卷共选比例计算与热图绘制
以下是针对写作发表障碍问卷数据的完整分析流程,全程使用tidyverse工具链实现:
1. 数据预处理(长格式转二元宽格式)
假设你的原始数据是长格式(每个受访者的每个选中障碍占一行),首先需要将其转换为宽格式的二元矩阵(行=受访者,列=障碍,1=选中,0=未选):
library(tidyverse) # 转换为宽格式二元矩阵 df_wide <- data %>% mutate(selection = 1) %>% pivot_wider( names_from = barrier, values_from = selection, values_fill = 0 ) %>% select(-Response_ID) # 移除ID列,仅保留障碍相关列
如果你的原始数据已经是宽格式(每列对应一个障碍,值为0/1),可直接跳过此步骤。
2. 计算共选比例矩阵
我们需要计算:选择障碍A的受访者中,同时选择障碍B的比例(双向比例不同,符合需求):
# 计算每个障碍的总选择人数 total_by_barrier <- colSums(df_wide) # 计算两两共选人数并转换为比例 cooccur_df <- t(crossprod(df_wide)) %>% # 转置后行=基准障碍A,列=对比障碍B,值=共选人数 as_tibble(rownames = "base_barrier") %>% pivot_longer( cols = -base_barrier, names_to = "cooccur_barrier", values_to = "cooccur_count" ) %>% left_join( enframe(total_by_barrier, name = "base_barrier", value = "total_base"), by = "base_barrier" ) %>% filter(total_base > 0) %>% # 排除无受访者选择的障碍(避免除以0) mutate(cooccur_prop = cooccur_count / total_base) %>% # 计算共选比例 select(base_barrier, cooccur_barrier, cooccur_prop)
3. 绘制热图(ggplot2 geom_tile)
将计算结果转换为可视化格式,用热图展示共选比例:
ggplot(cooccur_df, aes(x = cooccur_barrier, y = base_barrier, fill = cooccur_prop)) + geom_tile(color = "white") + # 白色边框区分色块 geom_text( aes(label = scales::percent(cooccur_prop, accuracy = 1)), size = 3, color = "white" ) + # 添加百分比标签,增强可读性 scale_fill_viridis_c( option = "mako", labels = scales::percent_format(), limits = c(0, 1) ) + # 使用渐变色系,用百分比标注色阶 labs( x = "同时选择的障碍", y = "基准障碍", fill = "共选比例" ) + theme_minimal() + theme( axis.text.x = element_text(angle = 45, hjust = 1), panel.grid = element_blank() # 移除网格线,突出色块 )
关键说明
crossprod(df_wide):快速计算两两障碍的共选人数矩阵,比循环更高效- 转置操作
t():确保行是基准障碍,列是对比障碍,对应"选A的人中选B的比例"的需求 - 可视化优化:旋转横轴标签、添加白色边框和百分比标签,避免信息重叠,提升可读性
内容的提问来源于stack exchange,提问作者hpy
相关产品推荐
相关产品推荐

