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

R语言实现id模糊匹配且日期在区间内的两表内连接方法

解决方法

首先你需要先把所有日期列从Factor类型转为Date类型,否则区间比较逻辑会出错:

# 转换日期类型
table_1$date_1 <- as.Date(as.character(table_1$date_1))
table_2$date_2 <- as.Date(as.character(table_2$date_2))
table_2$date_3 <- as.Date(as.character(table_2$date_3))

方法1:使用fuzzyjoin包的多条件模糊连接

fuzzyjoin支持同时指定多个匹配条件,你可以同时设置id的字符串距离匹配规则、以及日期区间匹配规则:

library(fuzzyjoin)
library(stringdist)

result <- fuzzy_inner_join(
  table_1, table_2,
  # 按顺序定义3个匹配规则
  match_fun = list(
    # 规则1:两个id的字符串编辑距离小于等于阈值(可按需调整大小,数值越大匹配越宽松)
    function(x,y) stringdist(x,y) <= 2,
    # 规则2:date_1大于等于date_2
    `>=`,
    # 规则3:date_1小于等于date_3
    `<=`
  ),
  # 按顺序对应匹配规则的左右表字段
  by = c("id" = "id", "date_1" = "date_2", "date_1" = "date_3")
)

方法2:先做id模糊连接再过滤日期区间

如果觉得多条件匹配的参数不好理解,也可以拆分步骤实现,逻辑更直观:

library(fuzzyjoin)

# 第一步:先按id做模糊连接,保留距离列方便校验
temp <- stringdist_inner_join(table_1, table_2, by ="id", distance_col = "id_dist")
# 第二步:过滤符合日期区间要求的行
result <- temp[temp$date_1 >= temp$date_2 & temp$date_1 <= temp$date_3, ]
# 可选操作:删掉不需要的id距离列
result$id_dist <- NULL

针对你的示例数据,两种方法得到的最终匹配结果一致:

  • table_1中id=123的行匹配table_2中id=123 A的行,日期2010-01-31刚好落在区间内
  • table_1中id=125的行匹配table_2中id=125的行,日期2016-01-31落在2010-2020的区间内
  • table_1中id=C125-B的行和table_2所有id的编辑距离超出阈值,不会匹配

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:45:04