R语言如何按行判断批量生成考试是否通过的新列
R语言实现批量判断考试通过状态
需求说明
现有学生多次数学考试结果数据集,需新增二分类列pass,判定规则:
- 任意一次
mathpass系列考试结果为"pass",该列值为"pass" - 所有
mathpass系列考试结果均为"fail",该列值为"fail"
初始示例数据:
id<-1:4 mathpass_1<-c("pass","fail","pass","fail") mathpass_2<-c("fail","fail","fail","fail") mathpass_3<-c("fail","fail","pass","pass") mathpass_4<-c("fail","fail","pass","fail") math<-data.frame(id,mathpass_1,mathpass_2,mathpass_3,mathpass_4)
实现方案
两种方案均无需手动枚举所有考试列,自动匹配所有mathpass_前缀的考试字段,计算效率高,可直接适配百万级以上的大数据量场景。
方案1:基础R实现(无第三方依赖)
不需要安装任何额外包,运行效率最高:
# 匹配所有mathpass_开头的考试列 exam_cols <- grep("^mathpass_", colnames(math), value = TRUE) # 逐行统计pass次数,大于0则标记为pass math$pass <- ifelse( rowSums(math[, exam_cols] == "pass", na.rm = TRUE) > 0, "pass", "fail" )
代码里的na.rm = TRUE会自动跳过缺失值,如果数据里存在缺考的空值,默认会按非pass处理,可根据业务规则调整。
方案2:dplyr实现(适配tidyverse工作流)
如果日常使用tidyverse生态处理数据,代码可读性更强:
library(dplyr) math <- math %>% mutate( pass = if_else( # 判断任意mathpass开头列是否存在pass值 if_any(starts_with("mathpass_"), ~ .x == "pass"), "pass", "fail" ) )
结果验证
运行上述任意一段代码后,得到的数据集和预期结果完全一致:
id mathpass_1 mathpass_2 mathpass_3 mathpass_4 pass 1 1 pass fail fail fail pass 2 2 fail fail fail fail fail 3 3 pass fail pass pass pass 4 4 fail fail pass fail pass
提示:如果后续新增更多次数学考试的字段,只要字段名保持
mathpass_数字的命名规则,上述代码不需要做任何修改,可直接运行得到正确结果。
内容的提问来源于stack exchange,提问作者yoo
相关产品推荐
相关产品推荐

