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

如何在R中从问卷多响应列创建可用于tbl_summary的频率变量?

处理多选项问卷变量(Q18)并适配tbl_summary分析

核心思路

多选项问题拆分成多列后,需要将其转换为长格式数据或每行聚合选中选项的格式,才能和单变量(如Q17)一样进行统计及交叉分析,适配tbl_summary的需求。

解决方案(推荐使用tidyverse工具)

1. 转换为长格式(适合频率统计与交叉分析)

先加载所需工具包:

library(tidyverse)
library(gtsummary)

提取Q18的所有列,转换为长格式并保留行号关联原数据:

# 生成Q18的长格式数据集
d_q18_long <- d %>%
  select(starts_with("v18_r")) %>%
  mutate(row_id = row_number()) %>% # 添加行号用于关联原数据的其他变量
  pivot_longer(
    cols = starts_with("v18_r"),
    names_to = "option",
    values_to = "selected",
    values_drop_na = TRUE # 过滤未选择的NA行
  ) %>%
  mutate(option = str_remove(option, "v18_r") %>% as.integer()) # 提取纯选项编号
  • 统计各选项频率:
table(d_q18_long$option)
  • 和原数据的其他变量(如v17)交叉分析:
    将长格式数据合并回原数据集,再用tbl_summary生成交叉统计:
d_combined <- d %>%
  mutate(row_id = row_number()) %>%
  left_join(d_q18_long, by = "row_id")

# 生成v17与Q18选项的交叉汇总表
d_combined %>%
  select(v17, option) %>%
  tbl_summary(by = v17)

2. 生成每行聚合的选项字符串(适合展示受访者的完整选择)

如果需要将每个受访者选中的所有Q18选项合并为一个变量,可使用:

d <- d %>%
  mutate(
    # 合并每行的非NA选项为逗号分隔的字符串
    q18_all_choices = pmap_chr(
      select(., starts_with("v18_r")),
      ~ paste(na.omit(c(...)), collapse = ", ")
    ),
    # 处理未选择任何选项的情况
    q18_all_choices = ifelse(q18_all_choices == "", "未选择", q18_all_choices)
  )
  • 统计各选择组合的频率:
table(d$q18_all_choices)
  • 和v17交叉分析:
d %>%
  select(v17, q18_all_choices) %>%
  tbl_summary(by = v17)

3. 改进原循环代码(仅用于频率统计)

如果坚持用原循环逻辑,可添加选项标识让结果更清晰:

count_result <- rep(0, 11)
names(count_result) <- paste0("选项", 1:11) # 给每个计数添加选项名称

for (i in 1:nrow(d)) {
  for (j in 1:11) {
    if (!is.na(d[i, paste0("v18_r", j)])) {
      count_result[j] <- count_result[j] + 1
    }
  }
}

count_result

说明

  • 长格式是处理多选项问题的标准方式,能最大程度适配后续的统计分析(包括tbl_summary的交叉分析、可视化等)。
  • 聚合字符串的方式更适合展示单个受访者的选择,但交叉分析时可能会因选项组合过多导致结果冗余。

内容的提问来源于stack exchange,提问作者user23311973

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:12:10