我使用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)在我的例子中,“富维奥·罗西·西奥卡”和“罗西·西奥卡·富维奥”是同一个人。事实上,我的数据集中的所有数据都包含相同的人,但都有类似于"Lennon John“这样的变体,而不是"John”。
我确实看过fuzzyjoin文档,但我找不到一种方法来编写这个伪代码的工作版本:
x %>%
fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")发布于 2018-02-10 00:17:52
通过按字母顺序对每个名称的各个部分进行排序,您可以构造每个名称的唯一“规范化”版本。
然后,当两个名称共享相同的规范化形式时,它们可以被认为是相同的。
因此,一个可能的解决办法是:
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 5https://stackoverflow.com/questions/48586505
复制相似问题