tidyr::separate函数:如何拆分含可变数量问卷题的列
解决方法:处理可变数量问题的回答顺序提取
我来帮你搞定这个问题!因为每个受访者回答的问题数量不一致,直接用separate()确实没法提前指定into参数的列名,咱们换个思路,用tidyverse工具链里的几个函数组合来实现你想要的结果:
步骤1:加载所需包并准备数据
首先确保你安装了tidyverse包,然后加载它并定义原始数据:
library(tidyverse) data <- data.frame(variables = c("q1:2,q2:3,q3:4,q4:10,q5:1", "q2:3,q1:2,q3:2,q5:2,q4:9", "q1:1,q2:4,q5:8"))
步骤2:拆分问题对并添加受访者ID
先给每个受访者分配唯一ID,再把每行的多个问题-时长对拆成单独的行,这样方便后续处理:
data_processed <- data %>% mutate(respondent_id = row_number()) %>% # 给每个受访者分配ID,用于分组 separate_rows(variables, sep = ",") # 按逗号拆分每个问题对到独立行
步骤3:提取问题名并记录回答顺序
把拆分后的字符串拆成问题名和时长(我们不需要时长,但拆分后更清晰),然后按受访者分组,记录每个问题在该受访者回答序列中的位置:
data_processed <- data_processed %>% separate(variables, into = c("question", "duration"), sep = ":", convert = TRUE) %>% group_by(respondent_id) %>% mutate(position = row_number()) %>% # 生成每个问题的回答位置 ungroup()
步骤4:转换为宽格式数据
最后把长格式的数据转成你需要的宽格式,缺失的问题会自动填充为NA:
final_data <- data_processed %>% select(respondent_id, question, position) %>% pivot_wider( names_from = question, values_from = position, names_prefix = "pos_" # 给列名加上pos_前缀,匹配你要的格式 ) %>% select(-respondent_id) # 移除受访者ID列,得到目标结构
最终结果
运行上述代码后,final_data就是你想要的数据框:
final_data # # A tibble: 3 × 5 # pos_q1 pos_q2 pos_q3 pos_q4 pos_q5 # <int> <int> <int> <int> <int> # 1 1 2 3 4 5 # 2 2 1 3 5 4 # 3 1 2 NA NA 3
这个方法的核心是先把数据拆成长格式处理可变数量的问题,再转换为宽格式得到目标结构,完美适配不同受访者回答问题数量不一致的场景。
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

