r - 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 的列是不是很奇怪?是否有另一种方法可以达到我在上面第一个表格中寻找的结果?
非常感谢!
解决方案
半连接的作用(来自 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")
推荐阅读
- laravel - laravel - save vs saveorfail (简而言之,真正的区别)
- c# - C# MVC Ajax 调用返回未定义
- python - 如何使用python获取进程的pid
- reactjs - 我可以在 React 和 TypeScript 中使用第三方库吗?
- c# - 如何从 Parallel.ForEach 循环访问 winform 文本框?
- php - PHP 复杂 XML 到 JSON 解析
- python - 熊猫数据框根据其他列是否有数据添加新列
- java - 在“/storage/emulated/0/Pictures/”中找不到文件
- c++ - Clang 不能编译基本的头文件(比如
) 在 macOS 中 - android - 如何在 Android Q 中获取深度图