You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RegEx与case_when划分数值范围时的逻辑错误排查

问题原因分析

你的问题出在两个核心点上:

  1. 正则未限定匹配下划线后的完整数字:第一个条件里的[7-9]会匹配数字中任意位置的7-9字符,比如"_17"里的7会被这个正则命中,直接触发A组匹配,但17实际属于B组范围。
  2. 锚定符$作用范围不全:第一个正则的$只加在了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:03:15