Как выполнить нечеткое сопоставление в 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