如何在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
相关产品推荐
相关产品推荐

