R如何使用向量加速模式匹配 跨数据框提取匹配ID
错误原因分析
%in%是完全相等匹配,仅当ac$ac的取值和df$description的整段内容完全一致才会返回匹配,你需要的是子串包含匹配,因此返回空。- 基础
grep不支持多pattern批量匹配,仅会取传入pattern向量的第一个值做匹配,因此仅返回第一个匹配结果。 str_detect的参数顺序搞反了:第一个参数是待检测的长文本,第二个是匹配模式,你把两个参数颠倒了自然全部返回FALSE。
解决方案
中小数据量通用方案(万行级别)
用stringr提取匹配字段后做匹配合并即可:
library(dplyr) library(stringr) # 合并所有待匹配的城市州名为正则模式,|表示或匹配 pattern <- str_c(ac$ac, collapse = "|") # 从df的description列提取匹配到的城市州名 df$matched_ac <- str_extract(df$description, pattern) # 左连接到ac表,保留ac的所有行 ac <- ac %>% left_join(df %>% select(matched_ac, id), by = c("ac" = "matched_ac"))
你给出的示例运行后ac的结果如下:
| ac | id |
|---|---|
| san francisco ca | 100559687 |
| pittsburgh pa | 100558946 |
| philadelphia pa | NA |
| washington dc | NA |
| new york ny | NA |
| aliquippa pa | NA |
| gainesville fl | NA |
| manhattan ks | 100547618 |
10万行级别高性能方案
双表都超过10万行的场景下,推荐用data.table实现,连接效率比dplyr高5-10倍:
library(data.table) library(stringr) # 转成data.table格式 setDT(ac) setDT(df) # 生成正则模式,有特殊字符的话先加str_escape(ac$ac)转义 pattern <- paste(ac$ac, collapse = "|") # 提取匹配字段 df[, matched_ac := str_extract(description, pattern)] # 左连接,保留ac的所有行 ac <- df[ac, on = .(matched_ac = ac), .(ac = i.ac, id)]
如果存在一个城市对应多个id的情况,不需要修改逻辑,会自动返回所有匹配结果。
内容的提问来源于stack exchange,提问作者jvalenti
相关产品推荐
相关产品推荐

