如何模糊匹配 R 中的单词(不是字母)?
How to fuzzy match by words (not letters) in R?
我需要根据包含不完全匹配的名称的列合并两个数据集,有时是因为其中一列相对于另一列缺少名称。例如,在一列中我有 "Martín Gallardo"
,在另一列中我有 "Martín Ricardo Gallardo"
。另一个问题是在某些名字和姓氏中出现颠倒,例如 "Martín Gallardo"
在一个中,而 "Gallardo Martín"
在另一个中。我如何使用 R 匹配它?我的第一个想法是在两者中都使用 str_split
并将一组中的每个分配给与另一组中更多元素匹配的那个,但我不确定如何编写代码。
谢谢。
编辑:数据看起来像这样
A <- tibble(email=c("martingallardo23@gmail.com","raulgimenez@gmail.com"),
name=c("martin", "raul"), last_name=c("gallardo","gimenez"),
full_name=c("martin gallardo", "raul gimenez"))
A
# A tibble: 2 x 4
# email name last_name full_name
# <chr> <chr> <chr> <chr>
# 1 martingallardo23@gmail.com martin gallardo martin gallardo
# 2 raulgimenez@gmail.com raul gimenez raul gimenez
B <- tibble(email=c("martingallardo@gmail.com", "raulgimenez2@gmail.com"),
name=c("martin ricardo", "gimenez"), last_name=c("gallardo", "raul"),
full_name=c("martin ricardo gallardo", "gimenez raul"), other_data=c("A", "B"))
B
# A tibble: 2 x 5
# email name last_name full_name other_data
# <chr> <chr> <chr> <chr> <chr>
# 1 martingallardo@gmail.com martin ricardo gallardo martin ricardo gallardo A
# 2 raulgimenez2@gmail.com gimenez raul gimenez raul B
这是一种简洁的连接方式。它基本上从 B 中找到 full_name 与 A 有最多的共同词。
图书馆(整洁宇宙)
A1 <- tibble(
nombre_completo = c("martin gallardo", "raul gimenez")
) %>%
mutate(
id_A = row_number()
)
B1 <- tibble(
nombre_completo=c("martin ricardo gallardo", "gimenez raul"),
other_data=c("A", "B")
) %>%
mutate(
id_B = row_number()
)
A2 <- A1 %>%
mutate(
name_words = str_split(nombre_completo, pattern = " ")
) %>%
unnest(cols = c(name_words))
B2 <- B1 %>%
mutate(
name_words = str_split(nombre_completo, pattern = " ")
) %>%
unnest(cols = c(name_words)) %>%
select(name_words, id_B )
left_join(A2, B2, by = "name_words") %>%
group_by(nombre_completo, id_A, id_B) %>%
count() %>% ungroup() %>%
group_by(nombre_completo, id_A) %>%
slice_max(order_by = n) %>%
select("nombre_completo_A" = nombre_completo, id_A, id_B) %>%
left_join(B1, by = "id_B")
为了匹配这两个数据集,我首先根据 nombre_completo
在数据集 A
部分匹配数据集 B
中的同一列。然后我合并了两个数据集,以便将数据集 B
中的附加列添加到 A
的重组形式中。这就是我首先解释你想要的输出的方式,所以我希望它对你有用:
A <- tibble(email=c("martingallardo23@gmail.com","raulgimenez@gmail.com"),
name=c("martin", "raul"), last_name=c("gallardo","gimenez"),
nombre_completo=c("martin gallardo", "raul gimenez"))
B <- tibble(email=c("martingallardo@gmail.com", "raulgimenez2@gmail.com"),
name=c("martin ricardo", "gimenez"), last_name=c("gallardo", "raul"),
nombre_completo=c("martin ricardo gallardo", "gimenez raul"),
other_data=c("A", "B"))
library(dplyr)
library(tidyr)
library(purrr)
A %>%
rowwise() %>%
mutate(nombre_completo2 = map_chr(nombre_completo,
~ B$nombre_completo
[str_detect(B$nombre_completo, str_sub(.x, 1L, 4L))])) %>%
inner_join(B, by = c("nombre_completo2" = "nombre_completo")) %>%
select(!ends_with(".y")) %>%
rename_with(~ str_replace(., ".x", ""), ends_with(".x"))
# A tibble: 2 x 6
# Rowwise:
email name last_name nombre_completo nombre_completo2 other_data
<chr> <chr> <chr> <chr> <chr> <chr>
1 martingallardo23@gmail.com martin gallardo martin gallardo martin ricardo gallar~ A
2 raulgimenez@gmail.com raul gimenez raul gimenez gimenez raul B
我需要根据包含不完全匹配的名称的列合并两个数据集,有时是因为其中一列相对于另一列缺少名称。例如,在一列中我有 "Martín Gallardo"
,在另一列中我有 "Martín Ricardo Gallardo"
。另一个问题是在某些名字和姓氏中出现颠倒,例如 "Martín Gallardo"
在一个中,而 "Gallardo Martín"
在另一个中。我如何使用 R 匹配它?我的第一个想法是在两者中都使用 str_split
并将一组中的每个分配给与另一组中更多元素匹配的那个,但我不确定如何编写代码。
谢谢。
编辑:数据看起来像这样
A <- tibble(email=c("martingallardo23@gmail.com","raulgimenez@gmail.com"),
name=c("martin", "raul"), last_name=c("gallardo","gimenez"),
full_name=c("martin gallardo", "raul gimenez"))
A
# A tibble: 2 x 4
# email name last_name full_name
# <chr> <chr> <chr> <chr>
# 1 martingallardo23@gmail.com martin gallardo martin gallardo
# 2 raulgimenez@gmail.com raul gimenez raul gimenez
B <- tibble(email=c("martingallardo@gmail.com", "raulgimenez2@gmail.com"),
name=c("martin ricardo", "gimenez"), last_name=c("gallardo", "raul"),
full_name=c("martin ricardo gallardo", "gimenez raul"), other_data=c("A", "B"))
B
# A tibble: 2 x 5
# email name last_name full_name other_data
# <chr> <chr> <chr> <chr> <chr>
# 1 martingallardo@gmail.com martin ricardo gallardo martin ricardo gallardo A
# 2 raulgimenez2@gmail.com gimenez raul gimenez raul B
这是一种简洁的连接方式。它基本上从 B 中找到 full_name 与 A 有最多的共同词。 图书馆(整洁宇宙)
A1 <- tibble(
nombre_completo = c("martin gallardo", "raul gimenez")
) %>%
mutate(
id_A = row_number()
)
B1 <- tibble(
nombre_completo=c("martin ricardo gallardo", "gimenez raul"),
other_data=c("A", "B")
) %>%
mutate(
id_B = row_number()
)
A2 <- A1 %>%
mutate(
name_words = str_split(nombre_completo, pattern = " ")
) %>%
unnest(cols = c(name_words))
B2 <- B1 %>%
mutate(
name_words = str_split(nombre_completo, pattern = " ")
) %>%
unnest(cols = c(name_words)) %>%
select(name_words, id_B )
left_join(A2, B2, by = "name_words") %>%
group_by(nombre_completo, id_A, id_B) %>%
count() %>% ungroup() %>%
group_by(nombre_completo, id_A) %>%
slice_max(order_by = n) %>%
select("nombre_completo_A" = nombre_completo, id_A, id_B) %>%
left_join(B1, by = "id_B")
为了匹配这两个数据集,我首先根据 nombre_completo
在数据集 A
部分匹配数据集 B
中的同一列。然后我合并了两个数据集,以便将数据集 B
中的附加列添加到 A
的重组形式中。这就是我首先解释你想要的输出的方式,所以我希望它对你有用:
A <- tibble(email=c("martingallardo23@gmail.com","raulgimenez@gmail.com"),
name=c("martin", "raul"), last_name=c("gallardo","gimenez"),
nombre_completo=c("martin gallardo", "raul gimenez"))
B <- tibble(email=c("martingallardo@gmail.com", "raulgimenez2@gmail.com"),
name=c("martin ricardo", "gimenez"), last_name=c("gallardo", "raul"),
nombre_completo=c("martin ricardo gallardo", "gimenez raul"),
other_data=c("A", "B"))
library(dplyr)
library(tidyr)
library(purrr)
A %>%
rowwise() %>%
mutate(nombre_completo2 = map_chr(nombre_completo,
~ B$nombre_completo
[str_detect(B$nombre_completo, str_sub(.x, 1L, 4L))])) %>%
inner_join(B, by = c("nombre_completo2" = "nombre_completo")) %>%
select(!ends_with(".y")) %>%
rename_with(~ str_replace(., ".x", ""), ends_with(".x"))
# A tibble: 2 x 6
# Rowwise:
email name last_name nombre_completo nombre_completo2 other_data
<chr> <chr> <chr> <chr> <chr> <chr>
1 martingallardo23@gmail.com martin gallardo martin gallardo martin ricardo gallar~ A
2 raulgimenez@gmail.com raul gimenez raul gimenez gimenez raul B