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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:22:34