在R语言中实现基于单字符差异的柔性数据合并
灵活模糊匹配合并数据集的解决方案
要实现仅差一个字符且唯一对应的键合并,不能直接用基础的merge()(它只支持完全匹配),得先筛选出符合条件的唯一键对,再基于这些配对完成合并。以下是具体步骤和代码:
1. 构造示例数据集
先模拟你提到的两个数据集:
df1 <- data.frame( Chave1 = c("AA_DLA_25051946", "BAJ_FRR_10091975", "CBR_ARM_30111961"), Valor1 = c(1, 2, 3) # 示例数据列 ) df2 <- data.frame( Chave2 = c("BA_DLA_25051946", "AB_FB_31101952", "ABR_ARM_30111961"), Valor2 = c(10, 20, 30) # 示例数据列 )
2. 生成所有键的配对并筛选符合条件的组合
首先生成两个数据集键的所有可能组合,再用你的字符串比较逻辑筛选出仅差一个字符的配对:
# 优化你的字符串比较函数,支持向量级别的配对比较 comparar_strings <- function(vec1, vec2) { mapply(function(s1, s2) { # 拆分字符后统计差异数,判断是否≤1 sum(strsplit(s1, "")[[1]] != strsplit(s2, "")[[1]]) <= 1 }, vec1, vec2) } # 生成所有键的笛卡尔积配对 all_pairs <- expand.grid(Chave1 = df1$Chave1, Chave2 = df2$Chave2, stringsAsFactors = FALSE) # 标记符合条件的配对 all_pairs$is_match <- comparar_strings(all_pairs$Chave1, all_pairs$Chave2) # 筛选出初步匹配的结果 matched_pairs <- all_pairs[all_pairs$is_match, ]
3. 确保配对的唯一性
必须保证每个Chave1只对应一个Chave2,且每个Chave2只对应一个Chave1,避免一对多或多对一的错误合并:
# 统计每个Chave1的配对数量,保留仅出现1次的 valid_chave1 <- names(table(matched_pairs$Chave1))[table(matched_pairs$Chave1) == 1] # 统计每个Chave2的配对数量,保留仅出现1次的 valid_chave2 <- names(table(matched_pairs$Chave2))[table(matched_pairs$Chave2) == 1] # 筛选出双向唯一的配对 unique_matches <- matched_pairs[ matched_pairs$Chave1 %in% valid_chave1 & matched_pairs$Chave2 %in% valid_chave2, ]
4. 基于唯一配对合并数据集
用筛选出的唯一配对作为桥梁,将两个数据集合并:
# 给df1添加对应的Chave2 df1_with_match <- df1[df1$Chave1 %in% unique_matches$Chave1, ] df1_with_match$Chave2 <- unique_matches$Chave2[match(df1_with_match$Chave1, unique_matches$Chave1)] # 合并两个数据集 final_result <- merge(df1_with_match, df2, by = "Chave2", all.x = TRUE) # 调整列顺序,保留原键列 final_result <- final_result[, c("Chave1", "Chave2", "Valor1", "Valor2")]
运行后,你会得到AA_DLA_25051946与BA_DLA_25051946成功合并的结果,同时排除了不满足唯一对应或差异超过1个字符的配对。
内容的提问来源于stack exchange,提问作者Bruna Firmino
相关产品推荐
相关产品推荐

