stringdist_semi_join показывает только столбцы из dataframe1 - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть два кадра данных:

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))

Я пытаюсь объединить эти кадры данных с fuzzyjoin.

Я ищу результат:

           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 для City с string_distance <9 я хочу строку в новой таблице, содержащую все столбцы из df1 и df2 с самым низким string_distance) Когда я делаю: </p>

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? Есть ли другой способ достичь результата, который я ищу в первой таблице выше?

Большое спасибо!

1 Ответ

0 голосов
/ 10 апреля 2020

Что делает полусоединение ( из документации dplyr ):

возвращает все строки из x, где есть совпадающие значения в y, сохраняя только столбцы из x. Полусоединение отличается от внутреннего соединения, потому что внутреннее объединение будет возвращать одну строку x для каждой соответствующей строки y, где полусоединение никогда не будет дублировать строки 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")
...