问题描述
我需要根据包含不完全匹配的名称的列合并两个数据集,有时是因为其中一列相对于另一列缺少名称。例如,在一列中我有 "Martín gallardo"
,而在另一列中我有 "Martín Ricardo gallardo"
。另一个问题是在某些名字和姓氏中显示相反,例如 "Martín gallardo"
在一个中而 "gallardo Martín"
在另一个中。我如何使用 R 匹配它?我的第一个想法是在两者中都使用 str_split
并将一个集合中的每个分配给与另一个集合中的更多元素匹配的那个,但我不知道如何对此进行编码。
谢谢。
编辑:数据看起来像这样
A <- tibble(email=c("martingal[email protected]","raulgi[email protected]"),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 martingal[email protected] martin gallardo martin gallardo
# 2 raulgi[email protected] raul gimenez raul gimenez
B <- tibble(email=c("martingal[email protected]","raulgi[email protected]"),name=c("martin ricardo",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 martingal[email protected] martin ricardo gallardo martin ricardo gallardo A
# 2 raulgi[email protected] gimenez raul gimenez raul B
解决方法
这是一种进行连接的 tidyverse 方式。它基本上从 B 中找到 full_name ,它与 A 的常用词数量最多。 图书馆(tidyverse)
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_B) %>%
left_join(B1,by = "id_B")
,
为了匹配这两个数据集,我首先根据数据集 nombre_completo2
中的 A
} 部分匹配数据集nombre_completo
中的同一列。然后我合并了两个数据集,以便将数据集 A
中的附加列添加到 B
的重构形式中。这就是我首先解释您想要的输出的方式,所以我希望它对您有用:
B