R语言如何使用dplyr对多列执行ifelse条件判断生成新列
dplyr 实现方案
核心逻辑为逐行判断variable1/variable2/variable3是否同时为缺失值NA,匹配条件时取variable4/variable5/variable6的对应值,否则取前三列的值,赋值给新列variable8/variable9/variable10。
完整代码
# 加载dplyr包 library(dplyr) # 构造示例数据 dat <- data.frame( variable1 = c(NA,2,3,4,5,6,99), variable2 = c(NA,2,99,4,5,6,7), variable3 = c(NA,2,3,4,5,6,7), variable4 = c(5:11), variable5 = c(1,2,3,4,5,6,999), variable6 = c(1,2,3,4,999,6,7), variable7 = c(1:7) ) # 条件赋值生成新列 result <- dat %>% mutate( # 生成行级判断条件:前三列同时为NA row_match = is.na(variable1) & is.na(variable2) & is.na(variable3), variable8 = ifelse(row_match, variable4, variable1), variable9 = ifelse(row_match, variable5, variable2), variable10 = ifelse(row_match, variable6, variable3) ) %>% # 移除临时判断列 select(-row_match)
输出验证
运行代码后打印result,得到的结果和预期完全一致:
variable1 variable2 variable3 variable4 variable5 variable6 variable7 variable8 variable9 variable10 1 NA NA NA 5 1 1 1 5 1 1 2 2 2 2 6 2 2 2 2 2 2 3 3 99 3 7 3 3 3 3 99 3 4 4 4 4 8 4 4 4 4 4 4 5 5 5 5 9 5 999 5 5 5 5 6 6 6 6 10 6 6 6 6 6 6 7 99 7 7 11 999 7 7 99 7 7
写法说明
- 提前生成临时判断列
row_match,避免重复书写三次三列NA判断逻辑,代码可读性更高 - 用向量化函数
ifelse做逐行判断,执行效率高于逐行循环写法 - 如果需要批量处理更多同规则的列,可以搭配
across函数简化重复的列赋值代码,不需要逐列写ifelse逻辑
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

