Как проверить, совпадает ли строковый столбец фрейма данных со строковым столбцом другого фрейма данных? - PullRequest
0 голосов
/ 19 февраля 2019

Я собираюсь выполнить левое соединение двух фреймов данных, используя столбец с общими символами (назовем этот столбец с именем).В идеале все значения в столбце имени df1 должны соответствовать столбцу имени df2.Тем не менее, я понимаю, что некоторые значения могут не совпадать точно, но иметь частичное совпадение из-за некоторой орфографии или ошибки пунктуации.Например,«Джон Иезекииль» можно было бы записать как «Джон Иезекиаль» в df1.Я хочу убедиться, что каждое значение столбца имени в df1 будет совпадать с некоторым значением в столбце имени df2.В большинстве случаев будет точное совпадение, но в случаях, когда нет точных совпадений, я также хочу заменить те значения df1 значениями df2, которые имеют наиболее частичное совпадение.Я проиллюстрировал эту проблему, воспроизведя

df1 <- data.frame(name=c("John Ezekial","Mary Elizabeth","Fabio Fonini","Gael Monfils","Lucas Pouile"))    
df2 <- data.frame(name=c("Aron Ramsey","John Doe","John Ezekiel","Mary Elizabeth","Fabio Fognini","Gael Monfils","Marin Cilic","Lucas Pouille","Tomas Berdych","Juan Martin Del Potro"),id=1:10)
> df1
            name
1   John Ezekial
2 Mary Elizabeth
3   Fabio Fonini
4   Gael Monfils
5   Lucas Pouile

> df2
                name     id
1            Aron Ramsey  1
2               John Doe  2
3           John Ezekiel  3
4         Mary Elizabeth  4
5          Fabio Fognini  5
6           Gael Monfils  6
7            Marin Cilic  7
8          Lucas Pouille  8
9          Tomas Berdych  9
10 Juan Martin Del Potro 10

Когда df1 выполняется с левым соединением с df2, я получаю следующие результаты:

> df1 %>% left_join(df2)
Joining, by = "name"
            name id
1   John Ezekial NA
2 Mary Elizabeth  4
3   Fabio Fonini NA
4   Gael Monfils  6
5   Lucas Pouile NA

Я хочу, чтобы результирующий кадр данных был какпоказано ниже.Значения «name» в df1 должны быть заменены значениями «name» в df2, если нет точных совпадений, и сопоставлены с их соответствующими идентификаторами.

   >df3
            name id
1   John Ezekiel 3
2 Mary Elizabeth 4
3   Fabio Fognini 5
4   Gael Monfils 6
5   Lucas Pouille 8

1 Ответ

0 голосов
/ 19 февраля 2019

Используя Base R, вы можете сделать что-то вроде:

 df2[which(adist(df1$name,df2$name)<2,T)[,2],]
                name id
    3   John Ezekiel  3
    4 Mary Elizabeth  4
    5  Fabio Fognini  5
    6   Gael Monfils  6
    8  Lucas Pouille  8
...