如何用str_detect识别多列指定诊断编码?正则错误求助
问题解决
错误原因
- 列范围错误:代码中
dx1:odx2是无效的列范围,你的数据里只有dx1和dx2,应改为dx1:dx2。 - 正则表达式语法错误:
[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
相关产品推荐
相关产品推荐

