R语言如何使用if else基于多列条件mutate生成新变量?
R中多列条件生成新变量的实现方法
首先明确条件优先级(从高到低,满足前面的条件后不再判断后续条件):
- x、y、z同时为1 → 赋值6
- G为1 → 赋值5
- T为1 → 赋值4
- S为1 → 赋值3
- y为1 → 赋值2
- x为1 → 赋值1
- 所有条件都不满足时默认返回NA
base R 嵌套ifelse实现
首先构造示例数据:
df <- data.frame( x = c(1,1,1,1), y = c(0,0,1,1), z = c(1,0,1,1), S = c(0,0,0,1), T = c(1,0,0,1), G = c(0,0,0,1) )
使用嵌套向量化ifelse生成新列:
df$new_var <- ifelse(df$x == 1 & df$y == 1 & df$z == 1, 6, ifelse(df$G == 1, 5, ifelse(df$T == 1, 4, ifelse(df$S == 1, 3, ifelse(df$y == 1, 2, ifelse(df$x == 1, 1, NA) ) ) ) ) )
dplyr::case_when 更简洁写法
嵌套ifelse层级多了之后可读性差、容易写错,推荐用dplyr的case_when函数实现:
library(dplyr) df <- df %>% mutate(new_var = case_when( x == 1 & y == 1 & z == 1 ~ 6, G == 1 ~ 5, T == 1 ~ 4, S == 1 ~ 3, y == 1 ~ 2, x == 1 ~ 1, .default = NA ))
结果验证
运行上述代码后,生成的new_var列结果如下:
| 原数据行号 | new_var值 | 对应条件 |
|---|---|---|
| 1 | 4 | T为1 |
| 2 | 1 | 仅x为1 |
| 3 | 6 | x、y、z同时为1 |
| 4 | 6 | x、y、z同时为1 |
注意事项
- 条件排列顺序直接决定最终结果,必须把优先级更高、更特殊的条件放在最前面
- 如有新增规则,按照优先级顺序对应添加条件行即可
内容的提问来源于stack exchange,提问作者Sabrina Gulab
相关产品推荐
相关产品推荐

