You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 10:03:38