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

如何用str_detect识别多列指定诊断编码?正则错误求助

问题解决

错误原因

  1. 列范围错误:代码中dx1:odx2是无效的列范围,你的数据里只有dx1和dx2,应改为dx1:dx2。
  2. 正则表达式语法错误:[00-99]是无效的字符范围——正则中[x-y]要求左右都是单个字符,且左字符的ASCII码小于右字符。你需要针对每个编码区间编写正确的正则规则:
    • S00-S99:匹配以S开头、后跟两位数字的编码
    • T07-T34:匹配以T开头、后跟07-34之间两位数字的编码
    • T4112:精确匹配该编码
    • W00-W99:匹配以W开头、后跟两位数字的编码

修正后的代码

library(tidyverse)
library(stringr)

raw_df <- tibble::tribble(
     ~dx1, ~dx2, ~ecm1, ~ecm2,
     "S045",   "T401",    "X64", "V99",
     "R901",   "T5621A",  "Y141", "U033",
       "J76",   "I51",    "K44", "G304"
)

dat <- raw_df %>%
  mutate(diagn = case_when(
    # 修正列范围与正则表达式
    if_any(c(dx1:dx2, ecm1:ecm2),
           ~str_detect(., regex("^S[0-9]{2}|^T(0[7-9]|[12][0-9]|3[0-4])|^T4112|^W[0-9]{2}"))) ~ 1,
    TRUE ~ 0
  ))

# 查看结果
dat

代码解释

  • ^S[0-9]{2}:匹配以S开头、后跟任意两位数字的编码(覆盖S00-S99区间)
  • ^T(0[7-9]|[12][0-9]|3[0-4]):匹配T开头,后跟07-09、10-29、30-34的编码(覆盖T07-T34区间)
  • ^T4112:精确匹配T4112编码
  • ^W[0-9]{2}:匹配以W开头、后跟任意两位数字的编码(覆盖W00-W99区间)
  • if_any检查指定列中是否至少有一个符合条件,符合则标记为1,否则为0

运行后输出结果:

# A tibble: 3 × 5
  dx1   dx2    ecm1  ecm2  diagn
  <chr> <chr>  <chr> <chr> <dbl>
1 S045  T401   X64   V99       1
2 R901  T5621A Y141  U033      0
3 J76   I51    K44   G304      0

内容的提问来源于stack exchange,提问作者Jenny Mercado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:30:16