You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:57:11