Fuzzy matching uitvoeren in r (met voorbeeld)


Vaak wil je misschien twee sets gegevens in R samenvoegen op basis van niet perfect overeenkomende tekenreeksen. Dit wordt ook wel fuzzy matching genoemd.

De eenvoudigste manier om fuzzy matching uit te voeren in R is door de functie stringdist_join() uit het fuzzyjoin- pakket te gebruiken.

Het volgende voorbeeld laat zien hoe u deze functie in de praktijk kunt gebruiken.

Voorbeeld: fuzzy matching in R

Stel dat we de volgende twee dataframes in R hebben die informatie bevatten over verschillende basketbalteams:

 #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 Warriors 29
3 Heat 17
4 Netts 40
5 Kings 32
6 Lakes 30

Laten we nu zeggen dat we een left join willen doen, waarbij we alle rijen uit het eerste dataframe behouden en ze eenvoudigweg samenvoegen op basis van de teamnaam die het meest overeenkomt in het tweede dataframe.

Hiervoor kunnen we de volgende code gebruiken:

 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 Nets 40 0.0667
5 Warriors 104 Warriors 29 0.0417

Het resultaat is een dataframe dat elk van de oorspronkelijke vijf teamnamen uit het eerste dataframe bevat, evenals het team dat het meest overeenkomt met het tweede dataframe.

Opmerking #1 : We kiezen ervoor om de jw- afstandsmetriek te gebruiken voor matching. Dit is een afkorting voor Jaro-Winkler-afstand , een metriek die het verschil tussen twee snaren meet.

Opmerking 2: We hebben de slice_min() -functie uit het dplyr-pakket gebruikt om alleen de teamnaam uit het tweede dataframe weer te geven die het meest overeenkwam met de teamnaam uit het eerste dataframe.

Aanvullende bronnen

In de volgende tutorials wordt uitgelegd hoe u andere veelvoorkomende taken in R kunt uitvoeren:

Hoe meerdere dataframes samen te voegen in R
Gegevensframes samenvoegen op basis van meerdere kolommen in R

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert