如何在R语言中拆分允许多选的问卷问题答案?
处理问卷多选答案:拆分选项并展开成行
问题场景
你遇到的是问卷多选答案的典型处理需求——把用分号分隔的多个选项拆分成单独行,这样就能方便统计各选项的出现频率。你用str_split得到列表是正常的,因为它会把每个受访者的选项拆成向量存入列表元素,而我们需要的是把这些向量展开成单独的行记录。
解决方案(推荐用tidyverse工具)
用tidyr包的separate_rows函数可以一步完成拆分和行展开,同时保留受访者的其他信息(比如ID),操作更简洁:
- 先加载所需包:
library(dplyr) library(tidyr)
- 示例数据(模拟你的问卷数据):
survey <- tibble( 受访者ID = 1:3, 通勤方式 = c("步行;驾车", "乘公交", "步行;乘公交;骑行") )
- 拆分并展开成行,同时清理选项前后的空格:
survey_clean <- survey %>% separate_rows(通勤方式, sep = ";") %>% # 按分号拆分并展开 mutate(通勤方式 = trimws(通勤方式)) # 去掉选项前后的空格(避免" 驾车"这种带空格的情况)
- 统计最常见的通勤方式:
survey_clean %>% count(通勤方式, sort = TRUE) # sort=TRUE会按次数从多到少排序
Base R 替代方案
如果不想用tidyverse,也可以用基础R实现:
# 拆分得到列表 split_list <- str_split(survey$通勤方式, ";") # 生成每个选项对应的受访者ID id_list <- rep(survey$受访者ID, sapply(split_list, length)) # 提取所有选项并清理空格 travel_options <- trimws(unlist(split_list)) # 组合成清理后的数据框 survey_clean_base <- data.frame(受访者ID = id_list, 通勤方式 = travel_options) # 统计频率 table(survey_clean_base$通勤方式)
这样处理后,每个受访者的每个通勤选项都会单独占一行,你可以轻松统计出最受欢迎的通勤方式。
内容的提问来源于stack exchange,提问作者Shout
相关产品推荐
相关产品推荐

