查找向量的至少一个元素是否匹配至少一个正则表达式

问题描述 投票:2回答:2

我有几个正则表达式的向量。它们是如此之短且如此不同,以至于不值得尝试制作一个可以同时捕获所有它们的正则表达式。

我也有一个数据表,其中有两列,一列包含字符串,另一列是ID,每个ID包含多个字符串。

我需要找出哪个ID,至少一个相关ID与至少一个正则表达式之间不匹配。

MWE:

icd10.autol.tr.regex <- c("C91\\.00", "C92\\.00", "D61\\.\\d{1,2}", "C91\\.10", "C92\\.10", "Q82\\.8", "D76\\.1", "C81\\.\\d{1,2}", "E76\\.0", "C90\\.00", "C94\\.60", "C85\\.9", "Q78\\.2", "D59\\.5", "D57\\.1", "D56\\.\\d{1,2}", "D82\\.\\d{1,2}", "C86\\.4", "C93\\.3\\d", "C91\\.6\\d")
codes.to.check <- data.frame(code=c("E85.3",  "C90.00", "Z45.20", "N08.4",  "Z29.21", "Z52.01",  "C79.3",  "Z45.20", "F05.9",  "B99", "A04.7",  "R63.3"), id=c(1,1,1,1,1,1,2,2,2,2,2,2))

[这里,我希望结果看起来像

ID  result 
1   TRUE      #because we matched C90.00
2   FALSE     #no match 

如果我将可能的代码列表作为字符串,则应使用%in%。对于正则表达式,我尝试使用stringr中的str_extract,但似乎并没有使用矢量作为锯齿状图案。我想我可以使用str_extract进行嵌套循环,但这感觉效率很低。还有更惯用的方法吗?

r regex
2个回答
2
投票

我们可以用paste|正则表达式向量的元素,并在str_detect中使用它,然后用any换行,以检查它们是否与'id'分组后是否匹配

library(dplyr)
library(stringr)
codes.to.check %>%
    group_by(id) %>%
    summarise(result = any(str_detect(code, str_c(icd10.autol.tr.regex, 
           collapse="|"))))
# A tibble: 2 x 2
#     id result
#  <dbl> <lgl> 
#1     1 TRUE  
#2     2 FALSE 

0
投票

base中的另一个解决方案:

aggregate(result ~ id, 
          cbind(id = codes.to.check$id, 
                result = grepl(paste(icd10.autol.tr.regex, collapse="|"), codes.to.check$code)), 
          any)

#>   id result
#> 1  1   TRUE
#> 2  2  FALSE
© www.soinside.com 2019 - 2024. All rights reserved.