R语言如何基于多列条件从现有列取值创建数据框新列
R 按多列条件新增列实现方案
你可以直接用条件判断函数匹配规则生成new列,两种常用写法如下:
写法1:dplyr::case_when(逻辑最清晰,推荐)
这种写法把每条条件和对应取值一一对应列出来,后续加改规则很方便,不容易出错:
library(dplyr) df <- df %>% mutate( new = case_when( a == 2 & b == 2 & c == 1 ~ e, a == 2 & b == 1 & c == 2 ~ d, a == 2 & b == 2 & c == 2 ~ e, # 未匹配到上述规则的行默认赋值NA,可按需补充剩余规则 TRUE ~ NA_real_ ) )
你给出的规则里,a=2、b=2时不管c是1还是2都取e的值,还可以把重复逻辑合并简化代码:
# 简化后版本 df <- df %>% mutate( new = case_when( a == 2 & b == 2 ~ e, a == 2 & b == 1 & c == 2 ~ d, TRUE ~ NA_real_ ) )
写法2:base R 原生实现(无需安装加载第三方包)
不想用tidyverse系列包的话,嵌套ifelse就能实现:
df$new <- with(df, ifelse(a == 2 & b == 2 & c == 1, e, ifelse(a == 2 & b == 1 & c == 2, d, ifelse(a == 2 & b == 2 & c == 2, e, NA) ) ) )
注意事项
- 做相等判断时必须用双等号
==,不要写成单等号=,否则会意外修改原列的值 - 当前你给出的3条规则没有覆盖测试数据集中所有行的场景,比如a=1的行、a=2且b=1且c=1的行,这些行目前默认赋值为NA,你可以按照相同格式补充对应规则即可。
运行代码后得到的测试数据集结果如下:
a b c d e new 1 2 2 1 1 4 4 2 2 1 1 3 5 NA 3 1 1 2 5 1 NA 4 2 2 2 2 7 7 5 1 2 1 7 3 NA 6 1 2 2 5 5 NA
内容的提问来源于stack exchange,提问作者user18937485
相关产品推荐
相关产品推荐

