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
相关产品推荐
相关产品推荐

