使用RegEx与case_when划分数值范围时的逻辑错误排查
问题原因分析
你的问题出在两个核心点上:
- 正则未限定匹配下划线后的完整数字:第一个条件里的
[7-9]会匹配数字中任意位置的7-9字符,比如"_17"里的7会被这个正则命中,直接触发A组匹配,但17实际属于B组范围。 - 锚定符
$作用范围不全:第一个正则的$只加在了1[0-5]后面,没有覆盖[7-9],导致只要字符串里存在7-9的数字(不管位置),就会被判定为A组。
解决方案
方案一:修正正则表达式
调整正则,精确匹配下划线后的完整数字,并给所有规则加上结尾锚定$,确保只匹配字符串末尾下划线后的数字部分:
data %>% mutate(group = case_when( str_detect(year, pattern = "_([7-9]|1[0-5])$") ~ "A", str_detect(year, pattern = "_(1[6-9]|2[0-4])$") ~ "B" ))
方案二:先提取数字再判断(更可靠)
比起用正则匹配范围,先提取下划线后的数字转为数值型,再直接判断区间会更直观,也避免正则匹配的歧义:
library(stringr) data %>% mutate( # 提取下划线后的数字并转成数值 suffix_num = as.numeric(str_extract(year, "_([0-9]+)$", group = 1)), group = case_when( suffix_num >= 7 & suffix_num <= 15 ~ "A", suffix_num >= 16 & suffix_num <= 24 ~ "B" ) )
内容的提问来源于stack exchange,提问作者Xavier Villà Aguilar
相关产品推荐
相关产品推荐

