R语言中数据框分问题匹配正确/直觉答案向量的优化方案
解决跨题误判的简洁方案
这个问题我太熟悉了——全局向量确实很容易踩「跨题误判」的坑!其实完全不用嵌套循环,咱们换个思路:把每个题的正确答案和直觉答案做成绑定到ID的参考表,再和原始数据关联,就能实现精准匹配啦。
步骤1:创建题目-答案对应参考表
先把每个ID对应的正确答案、直觉答案一一对应起来,做成一个独立的数据框。这样每个题的答案都和自身ID绑定,不会出现串题的情况:
# 创建包含所有题目ID、正确答案、直觉答案的参考表 answer_key <- data.frame( ID = c("batBall", "lilyPad", "farmSheep", "xxx", "yyy", "zzz"), # 替换成你实际的所有题目ID Correct_Ans = c("5", "47", "8", "0", "5", "second"), # 每个ID对应的正确答案 Intuitive_Ans = c("10", "24", "7", "27", "100", "first") # 每个ID对应的直觉答案 )
注意:
ID的取值必须和你原始数据CRTData$ID完全一致(大小写、拼写都要匹配),否则会匹配失败。
步骤2:合并原始数据与参考表
用dplyr的left_join(或者base R的merge)把原始数据和参考表按ID合并,这样每一行数据都会带上对应题目的正确/直觉答案:
# 如果没装dplyr先安装:install.packages("dplyr") library(dplyr) # 按ID合并数据,保留原始数据的所有行 CRTData <- CRTData %>% left_join(answer_key, by = "ID")
步骤3:精准标记Intuitive和Correct列
现在可以逐行判断当前的Response是否等于对应题的直觉/正确答案,完全不会跨题误判:
# 标记是否选择了直觉答案 CRTData$Intuitive <- CRTData$Response == CRTData$Intuitive_Ans # 标记是否选择了正确答案 CRTData$Correct <- CRTData$Response == CRTData$Correct_Ans
进阶:处理一题多答案的情况
如果某个题目有多个直觉/正确答案(比如lilyPad的直觉答案是24和30),可以把参考表的答案列设为列表,再用rowwise逐行判断:
# 更新参考表,用I()包裹向量保存为列表列 answer_key <- data.frame( ID = c("batBall", "lilyPad"), Correct_Ans = I(list("5", "47")), Intuitive_Ans = I(list("10", c("24", "30"))) ) # 合并后逐行判断是否匹配任一答案 CRTData <- CRTData %>% left_join(answer_key, by = "ID") %>% rowwise() %>% mutate( Intuitive = Response %in% Intuitive_Ans, Correct = Response %in% Correct_Ans ) %>% ungroup()
这种方法的优势很明显:代码简洁易维护,后续要新增题目、修改答案,只需要更新参考表就行,不用调整判断逻辑,完全避免了全局向量的跨题污染问题。
内容的提问来源于stack exchange,提问作者NickB
相关产品推荐
相关产品推荐

