ggplot实现SPSS多响应变量无重复计数绘图及值标签显示
R实现ggplot绘制无重复计数的多响应变量分组分布图
依赖包加载
首先加载需要用到的处理、绘图包,其中haven包用于直接读取SPSS文件并保留原始值标签属性,无需手动做编码映射:
library(tidyverse) library(haven)
数据预处理(核心解决去重、值标签适配问题)
数据读入/模拟
如果是直接读取SPSS导出的.sav格式文件,直接用read_sav()函数读入即可,数据会自动保留SPSS中设置好的变量值标签。
如果是使用示例中的手动创建数据集,可以通过labelled()函数给变量添加和SPSS一致的标签属性,模拟SPSS读入效果:
# 示例数据集,已添加和SPSS一致的值标签 data <- data.frame( id = c(1,2,3), V1 = labelled(c(2,3,4), labels = c("选项A"=1, "选项B"=2, "选项C"=3, "选项D"=4)), V2 = labelled(c(1,2,3), labels = c("选项A"=1, "选项B"=2, "选项C"=3, "选项D"=4)), Group = labelled(c(1,2,1), labels = c("对照组"=1, "干预组"=2)) )
格式转换+去重
处理逻辑:
- 先将宽格式存储的多响应项V1、V2转换为长格式,统一为V的取值列
- 按「受访者id+分组+V取值」三个维度去重,同一受访者就算在V1、V2中同时选中同一个V值,也仅保留1条记录,彻底避免重复计数
- 直接将SPSS带标签的数值变量转换为因子,绘图时自动展示实际值标签,不会显示1、2、3这类原始编码
plot_data <- data |> pivot_longer(cols = c(V1, V2), values_to = "V_value") |> # 核心去重逻辑 distinct(id, Group, V_value, .keep_all = TRUE) |> mutate( V_value = as_factor(V_value), Group = as_factor(Group) )
绘图实现
以分组柱状图为例,直接基于去重后的数据绘图即可,自动显示SPSS值标签,计数无重复:
ggplot(plot_data, aes(x = V_value, fill = Group)) + geom_bar(position = position_dodge(width = 0.8), width = 0.7) + # 可选:在柱顶显示具体人次数 geom_text(stat = "count", aes(label = after_stat(count)), position = position_dodge(width = 0.8), vjust = -0.3, size = 3.5) + labs( x = "多响应变量V", y = "选择人次(无重复计数)", fill = "分组" ) + theme_bw(base_size = 12)
补充:如果需要计算各选项的选择占比,分母取各组唯一受访者总数即可,不要用总响应条数,参考代码如下:
rate_table <- plot_data |> group_by(Group) |> mutate(group_total = n_distinct(id)) |> group_by(Group, V_value, group_total) |> summarise(choice_count = n(), .groups = "drop") |> mutate(choice_rate = scales::percent(choice_count / group_total, accuracy = 0.1))
内容的提问来源于stack exchange,提问作者fenrir9
相关产品推荐
相关产品推荐

