R语言基于dplyr实现日期精确匹配+名称模糊匹配的表连接方法
实现方案
你需要配合stringdist包计算字符串编辑距离,搭配dplyr的分组、筛选操作即可实现需求,全程基于dplyr语法框架:
第一步:加载依赖包
library(dplyr) library(stringdist)
第二步:匹配合并代码
核心逻辑是先按date字段精确关联,再对同日期下的名称计算编辑距离,取距离最小的匹配项,你的预期输出是保留b表全量字段匹配a表的price,所以是b左连a,代码如下:
result <- b %>% # 先按date精确关联,得到同日期下a、b表所有名称配对 left_join(a, by = "date", suffix = c("_b", "_a")) %>% # 计算两个名称的Levenshtein编辑距离,数值越小相似度越高 mutate(name_dist = stringdist(name_b, name_a, method = "lv")) %>% # 按b表的唯一标识分组 group_by(name_b, date, qty) %>% # 取每组中编辑距离最小的匹配结果,with_ties=FALSE避免距离相同出现重复行 slice_min(name_dist, n = 1, with_ties = FALSE) %>% ungroup() %>% # 整理字段得到和预期一致的输出 select(name = name_b, date, qty, price)
补充说明
- 如果需要控制匹配精度,可以在
slice_min前增加filter(name_dist < 3)类的逻辑,过滤掉相似度太低的错误匹配 - 如果你确实需要保留a表的所有行(即a左连b),只需把代码中
b %>% left_join(a,...)改为a %>% left_join(b,...),后续逻辑对应调整字段名即可 - 你之前尝试的
stringdist_join也可以实现需求,只是需要为不同连接键指定匹配规则,参考写法如下:
library(fuzzyjoin) result <- b %>% stringdist_left_join( a, by = c("date" = "date", "name" = "name"), match_fun = list(`==`, function(x,y) stringdist(x,y) < 3), max_dist = 2 ) %>% select(name = name.x, date = date.x, qty, price)
内容的提问来源于stack exchange,提问作者derek
相关产品推荐
相关产品推荐

