R语言需求:为新表中模糊匹配的姓名分配对应ID
近似姓名匹配并关联ID的解决方案
可以结合dplyr和fuzzyjoin包的stringdist_join实现需求,核心思路是先做近似匹配,再筛选每个目标姓名的最佳匹配项:
步骤1:加载依赖包
library(dplyr) library(fuzzyjoin)
步骤2:执行近似匹配与结果筛选
# 读取示例数据 df1 <- read.table(text=" id full_name 1 'Tom Jones' 2 'Jim James'", header = TRUE, stringsAsFactors = FALSE) df2 <- read.table(text=" full_name 'Tom Jones Jr.' 'Jim James Ii'", header = TRUE, stringsAsFactors = FALSE) # 执行近似匹配并筛选最佳结果 result_df <- stringdist_join(df2, df1, by = "full_name", max_dist = 5, # 根据姓名差异程度调整最大允许距离 method = "lv") %>% # 使用Levenshtein编辑距离计算相似度 group_by(full_name.x) %>% # 按df2中的姓名分组 filter(stringdist == min(stringdist)) %>% # 保留每组中匹配距离最小的项 ungroup() %>% select(id, full_name = full_name.x) # 整理成目标格式 # 查看最终结果 print(result_df)
关键参数说明
method = "lv":采用Levenshtein编辑距离计算两个字符串的差异,适合处理姓名后缀差异的场景;也可根据实际情况换成jaccard、cosine等其他匹配算法。max_dist:设置最大允许的匹配距离,确保只保留差异较小的匹配对,避免错误关联。
输出结果
# A tibble: 2 × 2 id full_name <int> <chr> 1 1 Tom Jones Jr. 2 2 Jim James Ii
内容的提问来源于stack exchange,提问作者Ben Blackburn
相关产品推荐
相关产品推荐

