首页 > 解决方案 > stringdist_semi_join 仅显示来自 dataframe1 的列

问题描述

我有两个数据框:

df1 <- data.frame(City=c("Munchen_Paris","Munchen_Paris","Barcelona_Milan", "Londen_Dublin","Madrid_Malaga"), 
                  value1=c(11,21,33,2,53))

df2 <- data.frame(City=c("Munnich_Parijs","Barcelona_Munster","Barcelona_Milan","London_Dub","London_Oxford","Pisa_Luik"), 
                  value2=c(22,2,44,54,29,65))

我尝试将这些数据框与模糊连接合并。

我正在寻找的结果是:

           City.x  value1   City.y             value2  string_distance
1   Munchen_Paris      11   Munnich_Parijs     22      5
2   Munchen_Paris      21   Munnich_Parijs     22      5
3 Barcelona_Milan      33   Barcelona_Milan    44      0
4   Londen_Dublin       2   London_Dub         54      4

(对于 df1 中的每一行与 df2 中字符串距离 < 9 的 City 匹配,我希望新表中有一行包含 df1 和 df2 中字符串距离最低的所有列)当我这样做时:

df3 <- stringdist_semi_join(df1, df2, by = "City", max_dist = 9, distance_col = "string_distance")

我只收到这些列:

> df3
             City value1
1   Munchen_Paris     11
2   Munchen_Paris     21
3 Barcelona_Milan     33
4   Londen_Dublin      2

如果我完全加入,我会收到:

> df3 <- stringdist_full_join(df1, df2, by = "City", max_dist = 9, distance_col = "string_distance")

> df3
           City.x value1            City.y value2 string_distance
1   Munchen_Paris     11    Munnich_Parijs     22               5
2   Munchen_Paris     21    Munnich_Parijs     22               5
3 Barcelona_Milan     33 Barcelona_Munster      2               6
4 Barcelona_Milan     33   Barcelona_Milan     44               0
5   Londen_Dublin      2        London_Dub     54               4
6   Londen_Dublin      2     London_Oxford     29               7
7   Madrid_Malaga     53              <NA>     NA              NA
8            <NA>     NA         Pisa_Luik     65              NA

我可以删除包含 NA 和 group_by City.x 的行,尽管随后我丢失了前两行之一。

如果我做 inner_join 我收到这个:

    df3 <- stringdist_inner_join(df1, df2, by = "City", max_dist = 9, distance_col = "string_distance")

df3

> df3
           City.x value1            City.y value2 string_distance
1   Munchen_Paris     11    Munnich_Parijs     22               5
2   Munchen_Paris     21    Munnich_Parijs     22               5
3 Barcelona_Milan     33 Barcelona_Munster      2               6
4 Barcelona_Milan     33   Barcelona_Milan     44               0
5   Londen_Dublin      2        London_Dub     54               4
6   Londen_Dublin      2     London_Oxford     29               7

stringdist_semi_join 不显示 df2 的列是不是很奇怪?是否有另一种方法可以达到我在上面第一个表格中寻找的结果?

非常感谢!

标签: rstringdistfuzzyjoin

解决方案


半连接的作用(来自 dplyr 文档):

返回 x 中在 y 中有匹配值的所有行,只保留 x 中的列。半连接与内连接不同,因为内连接将为 y 的每个匹配行返回一行 x,其中半连接永远不会复制 x 的行。

所以你看到的行为是预期的。

您正在寻找内部联接:

返回 x 中在 y 中有匹配值的所有行,以及 x 和 y 中的所有列。如果 x 和 y 之间有多个匹配项,则返回匹配项的所有组合。

fuzzyjoin这被称为stringdist_inner_join

df3 <- stringdist_inner_join(df1, df2, by = "City", max_dist = 9, distance_col = "string_distance")

推荐阅读