Comment effectuer une correspondance floue dans R (avec exemple)
Souvent, vous souhaiterez peut-être réunir deux ensembles de données dans R sur la base de chaînes imparfaitement correspondantes. C’est ce qu’on appelle parfois la correspondance floue .
Le moyen le plus simple d’effectuer une correspondance floue dans R consiste à utiliser la fonction stringdist_join() du package fuzzyjoin .
L’exemple suivant montre comment utiliser cette fonction dans la pratique.
Exemple : correspondance floue dans R
Supposons que nous ayons les deux trames de données suivantes dans R qui contiennent des informations sur diverses équipes de basket-ball :
#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
Supposons maintenant que nous souhaitions effectuer une jointure gauche dans laquelle nous conservons toutes les lignes du premier bloc de données et les fusionnons simplement en fonction du nom de l’équipe qui correspond le plus dans le deuxième bloc de données.
Nous pouvons utiliser le code suivant pour ce faire :
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
Le résultat est une trame de données contenant chacun des cinq noms d’équipe d’origine de la première trame de données ainsi que l’équipe qui correspond le plus à la seconde trame de données.
Remarque n°1 : Nous avons choisi d’utiliser la métrique de distance jw pour la correspondance. C’est l’abréviation de la distance Jaro-Winkler , qui est une métrique qui mesure la différence entre deux chaînes.
Remarque n°2 : Nous avons utilisé la fonction slice_min() du package dplyr pour afficher uniquement le nom de l’équipe de la deuxième trame de données qui correspondait le plus au nom de l’équipe de la première trame de données.
Ressources additionnelles
Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans R :
Comment fusionner plusieurs trames de données dans R
Comment fusionner des blocs de données basés sur plusieurs colonnes dans R