R语言dplyr case_when单分支匹配多值精简分支的正确语法
dplyr中case_when单分支匹配多个值的实现方法
case_when()完全支持单个条件分支配置多个匹配值,你之前的两种写法存在语法错误,无法得到预期结果,具体错误原因:
- 写法
x1== "foo"|"bar":逻辑或运算符|的两侧必须均为返回布尔值的逻辑表达式,该写法右侧为独立字符串"bar",R会将非空字符串直接判定为TRUE,导致条件永远成立,逻辑完全错误。 - 写法
x1== "foo|bar":该语句是判断x1是否等于字面量字符串"foo|bar",并非匹配"foo"或"bar"两个独立值,因此返回结果全为FALSE。
推荐实现方式
1. %in%运算符匹配(最简洁通用)
将所有需要匹配的值放入向量,通过%in%判断列值是否属于目标值集合,适配任意数量的匹配值,无冗余代码:
library(dplyr) q <- tibble(x1 = c("foo", "bar", "foo", "bu", "ba")) q %>% mutate(check = case_when( x1 %in% c("foo", "bar") ~ TRUE, TRUE ~ FALSE ))
运行后check列返回结果为TRUE, TRUE, TRUE, FALSE, FALSE,完全符合预期。后续如果需要新增匹配值,只需要在c("foo", "bar")中追加元素即可。
2. 标准逻辑或表达式
如果使用|做逻辑判断,必须保证运算符两侧是完整的判断表达式,不能省略列名和比较运算符:
q %>% mutate(check = case_when( x1 == "foo" | x1 == "bar" ~ TRUE, TRUE ~ FALSE ))
该写法在匹配值较多时需要重复书写判断逻辑,冗余度高,更适合仅2个匹配值的简单场景。
3. 正则匹配(适合有规律的文本匹配场景)
如果匹配值存在统一文本规律,可借助stringr::str_detect()通过正则规则匹配,注意要加首尾锚点避免误匹配包含目标片段的其他字符串:
library(stringr) q %>% mutate(check = case_when( str_detect(x1, "^foo$|^bar$") ~ TRUE, TRUE ~ FALSE ))
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

