R语言处理患者地址:判断401是否在30相关字符前标记目标住址
患者地址匹配解决方案
需求为标记居住在401 30th street的患者,核心校验规则:地址包含完整的401门牌号,且401出现在30相关街道标识(30/30th/30st/e30/e30th/east30等)之前,同时排除30后接其他数字(如300、305)、401属于长数字片段(如40120)的误匹配场景。
示例数据
数据预览
| 序号 | ADDRESS | 预期Outcome |
|---|---|---|
| 1 | 401 300th st | FALSE |
| 2 | 40120 30 street | FALSE |
| 3 | 30 401 plz | FALSE* |
| 4 | 401 30th st | TRUE |
| 5 | 401 e gibbsborro rd, 305 | FALSE |
| 6 | 401 e 30th street, shelter | TRUE |
| 7 | 401 east 30st | TRUE |
| 8 | 401 e30th street, 3 | TRUE |
| 9 | 77-02 30th ave, 3rd fl | FALSE |
| 10 | 401 e30 st. | TRUE |
*注:原示例中第3条标记为TRUE,不符合401在前的规则,应为输入笔误。如果业务确实需要将该类场景标记为TRUE,可调整正则为前后顺序双向匹配即可。
样本数据构造代码
location <- structure(list(ADDRESS = c("401 300th st", "40120 30 street", "30 401 plz", "401 30th st", "401 e gibbsborro rd, 305", "401 e 30th street, shelter", "401 east 30st", "401 e30th street, 3", "77-02 30th ave, 3rd fl", "401 e30 st."), Outcome = c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE)), class = "data.frame", row.names = c(NA, -10L))
现有代码问题
原有实现仅判断地址同时包含401和30相关标识,未校验二者先后顺序,也未排除30后接其他数字、401属于长数字片段的误匹配场景,会出现大量错误标记。
优化后实现代码
使用正则表达式的顺序匹配+负向先行断言规则,一次性完成所有校验:
library(dplyr) location <- location %>% mutate( ADDRESS = tolower(ADDRESS), st30 = grepl("\\b401\\b.*?\\b(30|30th|30st|e30|e30th|east30)\\b(?!\\d)", ADDRESS, perl = TRUE) )
正则规则说明
\\b401\\b:匹配完整的401单词,避免匹配40120这类包含401的长数字.*?:非贪婪匹配401和30相关标识之间的任意字符(如空格、e、east等中间字符)\\b(30|30th|30st|e30|e30th|east30)\\b:匹配指定的30相关街道标识(?!\\d):负向先行断言,排除30后面接其他数字的场景(如300、305等)
内容的提问来源于stack exchange,提问作者mar355
相关产品推荐
相关产品推荐

