在R语言中如何将错误答案及RT移至对应列并生成新行
解决方案
问题说明
参与者完成计算任务时,所有尝试的答案及反应时(RT)被错误记录。示例中正确答案为14,参与者先回答13、12后才得出正确结果。需要将错误答案及RT移至CorrectAns和CorrectRT列并生成新行,同时确保错误记录关联对应参与者及计算任务。
示例数据
df <- data.frame(Subject = c(1, 1, 1, 2, 2), Calc_ID = c(35, 35, 2, 61, 35), Calculation = c("5+2+1+6", "5+2+1+6", "5+1+2+7", "3+8-5-1", "5+2+1+6"), CorrectAns = c(14, 14, 15, 5, 4), CorrectRT = c(28361, 28361, 5261, 7535, 9476), IncorrectAns = c(13, 12, NA, NA, NA), IncorrectRT = c(10038, 15689, NA, NA, NA))
方法一:使用dplyr合并行
这种方法更直观,先将错误记录转换为与正确记录相同的格式,再合并到原数据中:
library(dplyr) # 提取错误记录,将错误答案/RT替换到Correct列 error_records <- df %>% filter(!is.na(IncorrectAns)) %>% mutate(CorrectAns = IncorrectAns, CorrectRT = IncorrectRT) %>% select(-IncorrectAns, -IncorrectRT) # 合并原正确记录(移除错误列)和转换后的错误记录,按参与者、任务、反应时排序 final_df <- bind_rows( df %>% select(-IncorrectAns, -IncorrectRT), error_records ) %>% arrange(Subject, Calc_ID, CorrectRT) print(final_df)
方法二:使用tidyr转长格式
通过将宽格式数据转换为长格式,统一处理正确和错误记录:
library(dplyr) library(tidyr) final_df <- df %>% # 将答案列转成长格式 pivot_longer( cols = c(CorrectAns, IncorrectAns), names_to = "AnswerType", values_to = "Answer", values_drop_na = TRUE ) %>% # 将反应时列转成长格式 pivot_longer( cols = c(CorrectRT, IncorrectRT), names_to = "RTType", values_to = "RT", values_drop_na = TRUE ) %>% # 匹配答案和反应时的类型(Correct/Incorrect) filter(substr(AnswerType, 1, 7) == substr(RTType, 1, 7)) %>% # 整理列名并排序 select(Subject, Calc_ID, Calculation, Answer, RT) %>% rename(CorrectAns = Answer, CorrectRT = RT) %>% arrange(Subject, Calc_ID, CorrectRT) print(final_df)
输出结果
两种方法都会得到如下结果,每个尝试(包括错误和正确)都作为独立行存在:
Subject Calc_ID Calculation CorrectAns CorrectRT 1 1 35 5+2+1+6 13 10038 2 1 35 5+2+1+6 12 15689 3 1 35 5+2+1+6 14 28361 4 1 35 5+2+1+6 14 28361 5 1 2 5+1+2+7 15 5261 6 2 61 3+8-5-1 5 7535 7 2 35 5+2+1+6 4 9476
内容的提问来源于stack exchange,提问作者Britt DV
相关产品推荐
相关产品推荐

