我正在使用fuzzyjoin
来跨越政治家及其各自的地区:
library(dplyr)
library(fuzzyjoin)
x <- tibble(name = c("Fulvio Rossi Ciocca", "Rigoberto Del Carmen Rojas Sarapura", "Lorena Vergara Bravo", "Lily Perez San Martin"),
activity = c("surgeon", "business", "public administration", "publicist"))
y <- tibble(name = c("Rossi Ciocca Fulvio", "Perez San Martin Lily"), region = c(1,5))
z <- x %>%
stringdist_inner_join(y, max_dist = 10)
在我的例子中,“Fulvio Rossi Ciocca”和“Rossi Ciocca Fulvio”是同一个人。实际上,我的数据集中的所有数据都包含相同的人,但有“Lennon John”而不是“John Lennon”的变体。
我确实看过fuzzyjoin
文档,但我找不到编写这个伪代码的工作版本的方法:
x %>%
fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")
答案 0 :(得分:3)
您可以通过按字母顺序对其各个部分进行排序来构建每个名称的唯一“规范化”版本。
当两个名称共享相同的标准化形式时,可以认为它们是相同的。
因此可能的解决方案是:
normalize <- function(v) lapply(strsplit(v, " "), sort)
mf <- function(a, b) mapply(identical, normalize(a), normalize(b))
fuzzy_left_join(x, y, by = "name", match_fun = mf)
# # A tibble: 4 x 4
# name.x activity name.y region
# <chr> <chr> <chr> <dbl>
# 1 Fulvio Rossi Ciocca surgeon Rossi Ciocca Fulvio 1
# 2 Rigoberto Del Carmen Rojas Sarapura business <NA> NA
# 3 Lorena Vergara Bravo public administration <NA> NA
# 4 Lily Perez San Martin publicist Perez San Martin Lily 5