如何用R语言为认知任务数据的Set trials判断作答准确性?
问题描述
我在编写循环和函数方面困难很大,一直靠if_else()和ifelse函数绕开这类操作,因为它们的逻辑结构更容易理解,但现在遇到了新问题。
我正在处理认知任务数据,每个试验要求参与者对variableA、variableB、variableC三个变量做出回应,我的数据框DF里每个试验对应这三个变量的列。需要判断作答是否正确,其中Set类型试验的正确条件是variableA == 1、variableB == 1且variableC == 2(部分试验有不同标准,这里只针对Set类型简化说明)。
我能按QType筛选Set和Test类型的行,但没法正确写代码实现「若A1、B1且C==2则标记为正确(比如1、True)」的逻辑。以下是我的数据框定义和尝试的代码:
数据框定义
DF <- data.frame(QType = c("Set","Set","Set","Set","Set","Test"), varA = c("1","1","2","1","1","2"), varB = c("1","1","1","0","1","0"), varC = c("2","1","2","2","2","2"), correct = "")
尝试的代码
# 尝试1 DF$correct <- DF %>% filter(QType == "Set") %>% if_else(c(varA == 1 & varB == 1 & varC == 2), 1, 0) # 尝试2 SetCorrect <- c(DF$varA == 1 & DF$varB == 1 & DF$varC == 2) DF$correct <- DF %>% filter(QType == "Set") %>% if_else(SetCorrect, 1, 0) # 尝试3 DF %>% filter(QType == "Set") %>% mutate(correct = case_when(varA == "1" ~ "1", varB == "1" ~ "1", varC == "1" ~ "1"))
解决方案
你的问题主要出在两个点:
- 变量类型不匹配:
varA、varB、varC是字符型(定义时用了带引号的"1"/"2"),但你用数值1/2做判断,导致条件不成立; - 赋值逻辑有误:直接筛选后赋值会丢失行数匹配,应该针对Set类型行单独判断,其他行保留原状态。
推荐两种符合你习惯的实现方式:
方法1:用if_else分步判断
library(dplyr) # 可选:把字符型变量转成数值型,避免后续判断出错 DF <- DF %>% mutate(across(c(varA, varB, varC), as.numeric)) # 给Set类型标记正确/错误,Test类型留空 DF <- DF %>% mutate(correct = if_else( QType == "Set" & varA == 1 & varB == 1 & varC == 2, 1, # 符合条件标记为1 if_else(QType == "Set", 0, "") # Set类型不符合标记为0,Test类型留空 ))
方法2:用case_when适配多条件扩展
如果后续要加其他试验类型的判断标准,用case_when会更清晰:
library(dplyr) DF <- DF %>% mutate( # 统一变量类型,不想转类型的话,把判断里的1换成"1"、2换成"2"即可 across(c(varA, varB, varC), as.numeric), correct = case_when( QType == "Set" & varA == 1 & varB == 1 & varC == 2 ~ 1, QType == "Set" ~ 0, # 其他Set类型都标记为错误 TRUE ~ "" # 非Set类型保持原空值 ) )
运行后得到的正确结果:
| QType | varA | varB | varC | correct |
|---|---|---|---|---|
| Set | 1 | 1 | 2 | 1 |
| Set | 1 | 1 | 1 | 0 |
| Set | 2 | 1 | 2 | 0 |
| Set | 1 | 0 | 2 | 0 |
| Set | 1 | 1 | 2 | 1 |
| Test | 2 | 0 | 2 |
内容的提问来源于stack exchange,提问作者hwright
相关产品推荐
相关产品推荐

