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

如何在分组数据中拆分重复question的响应至新列?

用tidyverse整理重复question的响应数据

我来帮你搞定这个数据整理的问题,用tidyverse工具链完全可以轻松解决,咱们一步步来拆解:

问题分析

你的数据里看似重复的question其实有两个小问题:

  • 部分question文本末尾带有空格(比如"37tlJa09k7zwKFL "和"37tlJa09k7zwKFL"),被识别成了不同的条目;
  • 同一study_id+question组下有两类响应:数值型的反应时间,和分类型的picture/word标记,需要拆分到独立列。

完整解决方案代码

library(tidyverse)

# 假设你的原始数据名为raw_data
cleaned_data <- raw_data %>%
  # 第一步:统一question格式,去除首尾空格
  mutate(question = str_trim(question)) %>%
  # 按研究ID和问题分组,确保处理同一参与者的同一问题
  group_by(study_id, question) %>%
  # 给每个响应标记类型:数值=反应时间(rt),文本=分类响应
  mutate(response_tag = case_when(
    str_detect(response, "^[0-9.]+$") ~ "rt",
    TRUE ~ "response_category"
  )) %>%
  # 把长表转成宽表,拆分两类响应到独立列
  pivot_wider(names_from = response_tag, values_from = response) %>%
  # 将反应时间转为数值类型(可选,但后续分析更方便)
  mutate(rt = as.numeric(rt)) %>%
  # 取消分组
  ungroup()

代码逐行解释

  • str_trim(question):彻底解决因空格导致的"伪重复"问题,让相同的question被正确识别为一组;
  • group_by(study_id, question):锁定每个参与者的每个独立问题,保证后续操作的针对性;
  • case_when + str_detect:通过正则表达式判断响应类型——纯数字(含小数点)的是反应时间,其余是分类标签;
  • pivot_wider:这是替代旧版spread的更灵活函数,直接把同一组的两类响应拆分成rt和response_category两列,实现一行对应一个唯一的study_id+question组合;
  • mutate(rt = as.numeric(rt)):把原本是字符型的反应时间转成数值,方便后续做统计分析。

处理后的数据示例

运行完代码后,你的数据会变成这样的结构(以前几行为例):

study_idquestionrtresponse_category
02ipnnqgeovkrxz37tlJa09k7zwKFL0.839word
02ipnnqgeovkrxz3WTpbAzIQmbnlpb0.739word
02ipnnqgeovkrxz3eEVJgaAP6c9FPL1.353picture

这样就完全满足你要的:每个study_id内question唯一,反应时间和分类响应各占一列的需求啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:37:45