我有几个正则表达式的向量。它们是如此之短且如此不同,以至于不值得尝试制作一个可以同时捕获所有它们的正则表达式。
我也有一个数据表,其中有两列,一列包含字符串,另一列是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进行嵌套循环,但这感觉效率很低。还有更惯用的方法吗?
我们可以用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
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