You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 09:06:02