使用stringdist_join关联时如何保证by列前8位UAI部分完美匹配
解决方案
你可以通过fuzzyjoin包的match_fun参数自定义匹配规则,实现「前8位UAI完全匹配+后续内容字符串距离匹配」的关联逻辑,有两种常用实现方式:
方式1:先提取独立UAI字段(更易排查,推荐)
第一步先给两个表单独提取前8位作为UAI字段:
library(dplyr) # 提取左表UAI Ech_final_nom <- Ech_final_nom %>% mutate(UAI = substr(UAInomprenom, 1, 8)) # 提取右表UAI BSA_affect_nom <- BSA_affect_nom %>% mutate(UAI = substr(UAInomprenom, 1, 8))
第二步调整join参数,指定两个关联字段的匹配规则:
library(fuzzyjoin) stringdist_join( Ech_final_nom, BSA_affect_nom, # 关联顺序:先匹配UAI,再匹配完整UAInomprenom by = c("UAI", "UAInomprenom"), mode = "left", ignore_case = FALSE, method = "jw", max_dist = 0.1117, distance_col = "dist", # 匹配规则和by字段顺序一一对应:UAI完全相等,完整字段走距离匹配 match_fun = list(`==`, stringdist::stringdist) )
方式2:无需新增字段,直接在匹配函数中做截取判断
如果不想修改原始表,可以直接自定义匹配函数实现规则:
library(fuzzyjoin) stringdist_join( Ech_final_nom, BSA_affect_nom, by = "UAInomprenom", mode = "left", ignore_case = FALSE, method = "jw", max_dist = 0.1117, distance_col = "dist", match_fun = list(function(x, y) { # 先校验前8位完全相等,再判断字符串距离是否符合阈值 substr(x, 1, 8) == substr(y, 1, 8) & stringdist::stringdist(x, y, method = "jw") <= 0.1117 }) )
内容的提问来源于stack exchange,提问作者David Potrel
相关产品推荐
相关产品推荐

