Как выполнить нечеткое сопоставление в R (с примером)


Часто вам может понадобиться объединить два набора данных в R на основе неполного совпадения строк. Это иногда называют нечетким соответствием .

Самый простой способ выполнить нечеткое сопоставление в R — использовать функцию stringdist_join() из пакета fuzzyjoin .

В следующем примере показано, как использовать эту функцию на практике.

Пример: нечеткое сопоставление в R

Предположим, у нас есть следующие два фрейма данных в R, которые содержат информацию о различных баскетбольных командах:

#create data frames
df1 <- data.frame(team=c('Mavericks', 'Nets', 'Warriors', 'Heat', 'Lakers'),
 points=c(99, 90, 104, 117, 100))
df2 <- data.frame(team=c('Mavricks', 'Warrors', 'Heat', 'Netts', 'Kings', 'Lakes'),
 assists=c(22, 29, 17, 40, 32, 30))

#view data frames
print(df1)

 team points
1 Mavericks 99
2 Nets 90
3 Warriors 104
4 Heat 117
5 Lakers 100

print(df2)

 team assists
1 Mavricks 22
2 Warrors 29
3 Heat 17
4 Netts 40
5 Kings 32
6 Lakes 30

Теперь предположим, что мы хотели бы выполнить левое соединение , в котором мы сохраняем все строки из первого фрейма данных и просто объединяем их на основе названия команды, которое наиболее точно соответствует во втором фрейме данных.

Для этого мы можем использовать следующий код:

library (fuzzyjoin)
library(dplyr)

#perform fuzzy matching left join
stringdist_join(df1, df2, 
 by='team', #match based on team
 mode='left', #use left join
 method = " jw", #use jw distance metric
 max_dist=99, 
 distance_col='dist') %>%
 group_by(team.x) %>%
 slice_min(order_by=dist, n= 1 )

# A tibble: 5 x 5
# Groups: team.x [5]
 team.x points team.y assists dist

1 Heat 117 Heat 17 0 
2 Lakers 100 Lakes 30 0.0556
3 Mavericks 99 Mavricks 22 0.0370
4 Nets 90 Netts 40 0.0667
5 Warriors 104 Warrors 29 0.0417

Результатом является один фрейм данных, который содержит каждое из пяти исходных названий команд из первого фрейма данных, а также команду, наиболее точно соответствующую из второго фрейма данных.

Примечание № 1. Мы решили использовать метрику расстояния jw для сопоставления. Это сокращение от расстояния Джаро-Винклера , которое является метрикой, измеряющей разницу между двумя строками.

Примечание № 2. Мы использовали функцию slice_min() из пакета dplyr, чтобы показать только название команды из второго фрейма данных, которое наиболее точно соответствует названию команды из первого фрейма данных.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные задачи в R:

Как объединить несколько фреймов данных в R
Как объединить фреймы данных на основе нескольких столбцов в R

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.