我有两个数据:
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 for City中的string_distance < 9匹配的行,我希望在新表中有一行包含来自df1和df2的所有列(string_distance值最低)):
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的列吗?还有别的方法可以达到我在上面的第一张表格中寻找的结果吗?
非常感谢!
发布于 2020-04-10 19:00:21
半连接做什么(来自dplyr文档):
返回y中有匹配值的x中的所有行,使列与x保持一致。半连接与内部连接不同,因为内部连接将为y的每一行返回一行x,其中半连接永远不会重复x的行。
所以你所看到的行为是预料之中的。
您正在寻找一个内部连接:
返回y中有匹配值的x中的所有行,以及x和y中的所有列。如果x和y之间有多个匹配,则返回所有匹配的组合。
在fuzzyjoin中,这称为stringdist_inner_join
df3 <- stringdist_inner_join(df1, df2, by = "City", max_dist = 9, distance_col = "string_distance")https://stackoverflow.com/questions/61145788
复制相似问题