如何用R基于DataFrame前两列判断结果有条件填充NA,优先使用tidyverse
R tidyverse 实现方案
你之前用mutate+across没成功,大概率是没处理NA值的比较逻辑:R中NA == NA返回的是NA而非TRUE,会导致判断条件失效。
以下是可直接运行的实现代码:
library(tidyverse) # 原始数据 df <- data.frame( Metric = c('WI', NA, 'MN', NA, 'CO', NA), Eval = c('WI', NA, 'AK', NA, 'CO', NA), colA = c(30, 'ABC', 45, 'DEF', 2, 'XYZ'), colB = c(25, 'BEC', 23, 'FED', 50, 'HIJ') ) # 简洁版实现(无辅助列) df_result <- df %>% mutate(across(Eval:last_col(), ~ifelse(Metric == Eval & !is.na(Metric) & !is.na(Eval), NA, .x)))
逻辑说明
- 判断条件里加入
!is.na的校验,规避NA值比较返回异常值的问题 across(Eval:last_col())自动选中Metric列右侧的所有列,不需要手动枚举列名,后续新增列也能自动适配- 用
ifelse批量对满足条件的行赋值为NA,符合tidyverse的惯用写法,可读性和扩展性都较好
运行后得到的df_result和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Natasha R.
相关产品推荐
相关产品推荐

