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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:21:22