R中使用fuzzyjoin遍历分块列表实现大数据集模糊匹配的问题求助
问题核心原因
你现有代码的问题在于map遍历list.a时,每次传入stringdist_inner_join的y参数是完整的list.b列表,而非对应首字母的子数据集,等于完全没用到你之前按首字母拆分的优化逻辑,还是在做全量匹配,自然耗时不会下降。
可行实现方案
首先提取两个列表共有的首字母分组键,避免某一方不存在对应首字母分组时出现匹配错误,再用map2遍历对应分组做匹配,最后用bind_rows合并所有结果即可:
library(tidyverse) library(fuzzyjoin) # 取两个列表共有的首字母键,保证分组一一对应 common_keys <- intersect(names(list.a), names(list.b)) # 只保留共有键对应的子数据集,保证两个列表顺序、长度完全对齐 a_sub <- list.a[common_keys] b_sub <- list.b[common_keys] # 遍历对应首字母的子数据集做模糊匹配,最后合并为完整结果 match_result <- map2(a_sub, b_sub, ~stringdist_inner_join(x = .x, y = .y, by = "name", ignore_case = FALSE, method = "jw", max_dist = 0.25)) %>% bind_rows()
额外优化建议
- 如果数据集量级仍然很大,可以把
map2换成furrr::future_map2开启多核并行,能进一步压缩匹配耗时 - 匹配前可以先对
name字段做标准化处理(比如统一大小写、去除特殊字符、冗余空格),减少无效匹配计算 - 可根据业务场景调整
max_dist阈值,阈值越小匹配计算量越低,速度越快
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

