首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带字符串排列的模糊连接

带字符串排列的模糊连接
EN

Stack Overflow用户
提问于 2018-02-02 16:03:07
回答 1查看 481关注 0票数 2

我使用fuzzyjoin来跨越政治家和他们各自的地区:

代码语言:javascript
复制
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文档,但我找不到一种方法来编写这个伪代码的工作版本:

代码语言:javascript
复制
x %>%
  fuzzy_join(y, mode = "left", match_fun = "A ~ permutations(A)")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 00:17:52

通过按字母顺序对每个名称的各个部分进行排序,您可以构造每个名称的唯一“规范化”版本。

然后,当两个名称共享相同的规范化形式时,它们可以被认为是相同的。

因此,一个可能的解决办法是:

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48586505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档