我不确定如何在没有任何外部包的情况下执行此操作,也许使用agrep?
fuzzyjoin 包正是针对这种情况而开发的。那么为什么不利用它呢。但是,您想要匹配的值看起来并不相似,即使您说:“有时这些值会有点不同”。因此,fuzzyjoin 解决方案可能无法在此处为您提供帮助。从以下可以看出:
library(fuzzyjoin)
df1 <- data.frame(province1=c("A Coruna", "Alicante/Alacant", "Santa Cruz de Tenerife"))
df2 <- data.frame(province1=c("Coruna, A", "Alicante", "4 Santa Cruz"))
data.frame(df1, df2)
province1 province1.1
1 A Coruna Coruna, A
2 Alicante/Alacant Alicante
3 Santa Cruz de Tenerife 4 Santa Cruz
以下合并尝试不返回匹配项:
merge(df1, df2, by = "province1")
# <0 rows> (or 0-length row.names)
现在尝试模糊匹配。用于连接的默认距离为 2。
stringdist_inner_join(df1, df2, by = "province1")
# A tibble: 0 x 2
# ... with 2 variables: province1.x <chr>, province1.y <fct>
这不会返回任何记录。所以尝试增加距离阈值。对于这个小例子,第一条记录需要 max.distance 为 5 才能被视为匹配。
stringdist_inner_join(df1, df2, by = "province1", max_dist = 5)
# A tibble: 1 x 2
province1.x province1.y
<chr> <fct>
1 A Coruna Coruna, A
您必须进一步提高阈值才能获得更多匹配项。但是这样做会失败,因为“A Coruna”也匹配“Alicante”!
stringdist_inner_join(df1, df2, by = "province1", max_dist = 7)
# A tibble: 2 x 2
province1.x province1.y
<chr> <fct>
1 A Coruna Coruna, A
2 A Coruna Alicante
将阈值提高到 8 得到“Alicante”,但仍匹配“A Coruna”。
stringdist_inner_join(df1, df2, by = "province1", max_dist = 8, distance_col = "dis")
# A tibble: 3 x 3
province1.x province1.y dis
<chr> <fct> <dbl>
1 A Coruna Coruna, A 5
2 A Coruna Alicante 7
3 Alicante/Alacant Alicante 8
所以您可以看到,这不适用于不太相似的值。在使用此方法之前,您可能需要进行一些数据清理。您可以尝试此功能中的各种方法。或者使用一些增加阈值的迭代方法,使已经匹配的记录不再匹配。