R语言:基于多列条件新增Pass列的实现方案
解决方案
你可以通过以下两种常用方法实现多列条件判断,给数据框新增pass列:
方法1:使用if_any(dplyr 1.0.0及以上版本推荐)
这种方法简洁高效,利用if_any检查每行是否存在至少一列符合答对条件:
library(dplyr) # 定义各题正确答案 correct_answers <- c(Q1 = "A", Q2 = "D", Q3 = "B", Q4 = "C") mydf_new <- mydf %>% mutate(pass = if_else( if_any(everything(), ~ .x == correct_answers[cur_column()]), "yes", "no" )) mydf_new
代码说明:
everything()表示选中所有列;~ .x == correct_answers[cur_column()]是针对每一列的判断逻辑:当前列的值是否等于对应题目的正确答案;if_any(...)会返回每行是否至少有一列满足判断条件;- 最后用
if_else将布尔结果转换为"yes"/"no"。
方法2:使用rowwise() + any()(兼容旧版dplyr)
如果你的dplyr版本较低,可以用逐行处理的方式:
library(dplyr) mydf_new <- mydf %>% rowwise() %>% mutate(pass = if_else( any(Q1 == "A", Q2 == "D", Q3 == "B", Q4 == "C", na.rm = TRUE), "yes", "no" )) %>% ungroup() mydf_new
代码说明:
rowwise()让数据框按行处理;any(..., na.rm = TRUE)判断该行是否有至少一个题目答对,na.rm = TRUE用来忽略NA值(因为NA与任何值比较都会返回NA,不忽略的话会导致结果异常);ungroup()取消逐行分组,恢复数据框默认结构。
结果差异说明
运行后mydf_new的pass列会修正之前单列判断的误差:比如第2行的Q3答对了,所以pass为"yes",而你之前单列判断时第2行是"no",这就是多列条件判断的核心作用。
内容的提问来源于stack exchange,提问作者dplyr
相关产品推荐
相关产品推荐

