如何在分组数据中拆分重复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_id | question | rt | response_category |
|---|---|---|---|
| 02ipnnqgeovkrxz | 37tlJa09k7zwKFL | 0.839 | word |
| 02ipnnqgeovkrxz | 3WTpbAzIQmbnlpb | 0.739 | word |
| 02ipnnqgeovkrxz | 3eEVJgaAP6c9FPL | 1.353 | picture |
这样就完全满足你要的:每个study_id内question唯一,反应时间和分类响应各占一列的需求啦。
内容的提问来源于stack exchange,提问作者adajam
相关产品推荐
相关产品推荐

