【问题标题】:Fuzzy merge on multiple variables (all but one with no mispellings)对多个变量进行模糊合并(除了一个没有拼写错误的变量)
【发布时间】:2019-03-20 12:40:35
【问题描述】:

我需要在三个变量上匹配两个数据集。 三个变量中的两个不存在拼写错误(按设计)。 只有第三个变量需要模糊匹配。

标准的 fuyyzmerge 通过模糊连接所有三个变量会产生一些问题。

有没有办法指定这三个中的哪个应该模糊匹配,哪个应该精确匹配?

可重现的例子:

dataset_1 <- setNames(data.frame(c(1995,1996,1995,1996),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBB")), c("var_1", "var_2", "var_3"))
dataset_2 <- setNames(data.frame(c(1995,1996,1995,1996),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBC"),c("A","B","C","D")), c("var_1", "var_2", "var_3","var_4"))


merged <- stringdist_join(dataset_1, dataset_2, 
                                  by=c("var_1","var_2","var_3"),  
                                  max_dist = 2, 
                                  method = c("soundex"),
                                  mode = "full", 
                                  ignore_case = FALSE)

理想结果:

merged <- setNames(data.frame(rep(1995,4),c("AA","AA","BB","BB"),c("AAAA","AAAA","BBBB","BBBB"),c("A","B","C","D")), c("var_1", "var_2", "var_3","var_4"))

【问题讨论】:

  • 技术上是的,但它对所有 by 变量进行笛卡尔积,因此在一次操作中可能会也可能不会,您的数据有多大?
  • 鉴于我在精确匹配后设法将其分解,我仍然保留大约一千个观察结果来模糊行进。
  • stringdist_join 是 fuzzy_join 的包装器,fuzzy_join 有一个 match_fun 参数,它可以是唯一函数或函数列表,只要你的 by 参数,所以我认为你可以使用 fuzzy_full_join 和 match_fun = list(`==`, `==`, function(x,y) stringdist::stringdist(x,y, "soundex") &lt; 2) 。如果您可以使您的示例可重现并提供您预期的输出,这将有所帮助。
  • 请在原帖中找到可重现的代码和预期结果。

标签: r dplyr fuzzyjoin


【解决方案1】:

stringdist_join 是 fuzzy_join 的包装器,fuzzy_join 有一个 match_fun 参数,它可以是唯一函数或函数列表,只要你的 by 参数,所以我们可以使用 @ 987654326@(就是fuzzy_join和mode= "full"):

library(fuzzyjoin)
res <- fuzzy_full_join(dataset_1, dataset_2, 
                by=c("var_1","var_2","var_3"),
                list(`==`, `==`, function(x,y) stringdist::stringdist(x,y, "soundex") <= 2))
res
#   var_1.x var_2.x var_3.x var_1.y var_2.y var_3.y var_4
# 1    1995      AA    AAAA    1995      AA    AAAA     A
# 2    1996      AA    AAAA    1996      AA    AAAA     B
# 3    1995      BB    BBBB    1995      BB    BBBB     C
# 4    1996      BB    BBBB    1996      BB    BBBC     D

由于模糊匹配的性质,lhs和rhs上的值通常不一样,所以我们最终得到了两组by列,如果你想只保留lhs我们可以这样做:

library(dplyr)
res %>% 
  select(-ends_with(".y")) %>%
  rename_all(~sub("\\.x$","",.))

#   var_1 var_2 var_3 var_4
# 1  1995    AA  AAAA     A
# 2  1996    AA  AAAA     B
# 3  1995    BB  BBBB     C
# 4  1996    BB  BBBB     D

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多