Introdução

fuzzyjoin tidyverse rstats


Parte desse texto é uma tradução desse site: https://www.statology.org/fuzzy-matching-in-r/

Este tutorial fornece uma breve introdução ao fuzzyjoin, focando nas funções mais úteis e como elas se combinam com o dplyr para facilitar a nossa vida.

Se você não estiver familiarizado com a lógica por trás do merge do R-base ou do join do dplyr, sugiro que você faça algumas abordagens desses métodos antes de tentar o fuzzyjoin.

Introdução ao fuzzyjoin

Freqüentemente, você pode querer juntar dois bancos de dados no R com base em strings com correspondência imperfeita. Às vezes, isso é chamado de fuzzy matching.

A maneira mais fácil de executar fuzzy matching no R é usar a função stringdist_join() do pacote fuzzyjoin.

O exemplo a seguir mostra como usar essa função na prática.

Exemplo: fuzzy matching no R

Suponha que temos os dois bancos de dados a seguir em R que contêm informações sobre vários times de futebol:

banco1 <- data.frame(time=c('Flamengo', 'Fluminense', 'Vasco', 'Botafogo', 'America'), gols=c(9, 1, 3, 0, 2))

banco2 <- data.frame(time=c('Framengo', 'Fruminense', 'Basco', 'Botafogos', 'Americas'), vitorias =c(3, 1, 2, 0, 1))



Agora suponha que gostaríamos de realizar uma união (join) à esquerda na qual vamos manter todas as linhas do primeiro banco de dados e simplesmente as mesclamos com base no nome do time que mais se aproxima no segundo banco de dados.

Podemos usar o seguinte código para fazer isso:

library(fuzzyjoin)
library(dplyr)

#perform fuzzy matching left join
stringdist_join(banco1, banco2, 
                by='time', #match based on time
                mode='left', #use left join
                method = "jw", #use jw distance metric
                max_dist=99, 
                distance_col='dist') %>%
  group_by(time.x) %>%
  slice_min(order_by=dist, n=1)
# A tibble: 5 × 5
# Groups:   time.x [5]
  time.x      gols time.y     vitorias   dist
  <chr>      <dbl> <chr>         <dbl>  <dbl>
1 America        2 Americas          1 0.0417
2 Botafogo       0 Botafogos         0 0.0370
3 Flamengo       9 Framengo          3 0.0833
4 Fluminense     1 Fruminense        1 0.0667
5 Vasco          3 Basco             2 0.133 



O resultado é um banco de dados que contém cada um dos cinco nomes de equipe originais do primeiro quadro de dados junto com a equipe que mais se aproxima do segundo quadro de dados.

Existem vários métodos para medir a distância entre duas palavras. Por exemplo, a distância entre Brasil e Brazil é igual a um. Optei por usar a métrica de distância jw para o matching. Isso é a abreviação da distância Jaro-Winkler, que é uma métrica que mede a diferença entre duas palavras.

Recursos adicionais

Este foi realmente um curso sobre a intuição do fuzzy join e suas funções mais usadas. Há muita flexibilidade aqui e muitas outras aplicações. Aqui estão dois bons pacotes do R para estudar a disância entre palavras:

  1. stringdist: Approximate String Matching, Fuzzy Text Search, and String Distance Functions
  2. tidystringdist: String Distance Calculation with Tidy Data Principles

e uma referência

https://www.statology.org/fuzzy-matching-in-r/