R dplyr::case_when单条件匹配多真值的简化写法咨询
解决方案
你可以使用R内置的%in%运算符实现多值匹配的简化写法,完全不需要重复编写testnr == x | testnr == y的逻辑。
%in%的作用是判断左侧的元素是否存在于右侧的目标向量中,适配你的场景的代码示例如下:
library(dplyr) testnr <- 1 # 匹配值为2/3/7/9的场景 print(case_when(testnr %in% c(2,3,7,9) ~ "true", TRUE ~ "false")) # 输出:[1] "false" # 匹配值为1/3/7/9的场景 print(case_when(testnr %in% c(1,3,7,9) ~ "true", TRUE ~ "false")) # 输出:[1] "true"
错误写法原因说明
testnr == 2 | 3 | 7 | 9:R中所有非0的数值在逻辑运算中都会被识别为TRUE,该写法实际等价于testnr ==2 | TRUE | TRUE | TRUE,最终条件恒成立,永远返回"true"testnr == (2 | 3 | 7 | 9):括号内的逻辑运算会优先执行,2|3的结果为TRUE,转换为数值等于1,该写法实际等价于testnr == 1,和你的匹配需求完全不符testnr == c(2,3,7,9):R会对左右两侧向量做逐元素比较,左侧单个值会被循环补齐到和右侧4个元素等长,最终返回长度为4的逻辑向量,因此case_when输出了4个结果
额外优化提示
如果你需要匹配的是连续区间的数值,可以直接用dplyr内置的between()函数进一步简化,比如匹配2到9之间的所有数值,写法为:
case_when(between(testnr, 2,9) ~ "true", TRUE ~ "false")
内容的提问来源于stack exchange,提问作者jaysigg
相关产品推荐
相关产品推荐

