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

R语言按行操作处理缺失值 按规则新增数据框pass列

R语言按行多条件生成pass列通用解法

原代码问题说明

你之前使用的dt$pass <- ifelse(rowSums(dt[,-1]=="YES",na.rm=T)>0,"YES","NO")逻辑存在漏洞:开启na.rm=TRUE参数时,所有科目全为缺失值的行,统计到的YES出现次数为0,和「无YES、存在NO」的行计算结果一致,无法区分两类判定场景,最终导致全缺失记录被误判为NO;关闭na.rm时只要行内存在任意缺失值,求和结果就会返回NA,无法正确识别带缺失值但存在YES的记录。

通用实现代码(适配任意数量科目列,无额外依赖)

# 选入所有科目列,示例中排除第1列ID即可,实际使用时根据自己的表结构调整选列规则
score_df <- dt[, -1]

# 按行计算两个判定指标
exist_yes <- rowSums(score_df == "YES", na.rm = TRUE) > 0
all_missing <- rowSums(is.na(score_df)) == ncol(score_df)

# 按规则逐行赋值
dt$pass <- ifelse(
  exist_yes,
  "YES",
  ifelse(all_missing, NA_character_, "NO")
)

运行后得到的结果和预期完全一致:

> dt
  ID math history pass
1  1  YES    <NA>  YES
2  2   NO    <NA>   NO
3  3  YES      NO  YES
4  4   NO      NO   NO
5  5 <NA>     YES  YES
6  6 <NA>    <NA> <NA>

逻辑适配说明

判定逻辑完全匹配需求,且不受科目列数量影响:

  • 优先判定最高优先级规则:任意科目出现至少1次YES,直接标记为YES,其他科目的缺失值不影响该判定
  • 对不存在YES的行,二次判断是否所有科目均为缺失值:是则标记为NA
  • 剩余无YES、且至少存在1个NO的行,统一标记为NO

如果实际数据中非成绩列较多,可以通过列名匹配、位置反选等方式灵活筛选科目列,后续判断逻辑不需要做任何修改,可直接适配几十上百门科目的大数据量场景。

内容的提问来源于stack exchange,提问作者yoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:42:17