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

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *