name
,
occupation
和
organization
。在这些列中,我的名称略有不同。例如,
Anne Sue Frank
和
Anne S. Frank
指同一人,因为他们具有相同的职业,并且属于同一组织。我有一种方法可以创建另一个表格将这些名称映射到相应匹配的表格吗?我尝试使用StringDist,但它主要是与自己匹配的名称(例如,与同一行的
Anne Sue Frank
Anne Sue Frank
),我不想要。我的讨论是找到重复的名称,因此我需要一个新的表,在第二列中的列中显示了列中的名称。
示例:
df1 <- data.frame(
name = c("Anne Sue Frank", "John S. Gooble", "Anne S. Frank", "Johnatan Sue Google"),
organization = c("ABC", "FCV", "ABC", "FCV"),
occupation = c("director", "teacher", "director", "teacher"),
stringsAsFactors = FALSE
)
df1
name organization occupation
1 Anne Sue Frank ABC director
2 John S. Gooble FCV teacher
3 Anne S. Frank ABC director
4 Johnatan Sue Google FCV teacher
这里是一种解决方案
首先,我们进行自我加入,然后我们用自置并用
inner_join
重复。
在使用Jaro-Winkler方法计算相似度得分之后filter(name1 < name2)
我们应用相似性。
"jw"
挑战在于确定适当的相似性_threshold,在这种情况下,这将设置为
library(dplyr)
library(stringdist)
df1 %>%
inner_join(df1, join_by(organization, occupation), suffix = c("1", "2"), relationship = "many-to-many") %>%
filter(name1 < name2) %>%
mutate(similarity = 1 - stringdist(name1, name2, method = "jw")) %>%
filter(similarity >= 0.75) %>% # define and tweak similarity_threshold
relocate(organization, occupation, name1, name2, similarity) |>
as_tibble()
organization occupation name1 name2 similarity
<chr> <chr> <chr> <chr> <dbl>
1 FCV teacher John S. Gooble Johnatan Sue Google 0.760
2 ABC director Anne S. Frank Anne Sue Frank 0.927
。