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.
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.
Suponha que temos os dois bancos de dados a seguir em R que contêm informações sobre vários times de futebol:
<- data.frame(time=c('Flamengo', 'Fluminense', 'Vasco', 'Botafogo', 'America'), gols=c(9, 1, 3, 0, 2))
banco1
<- data.frame(time=c('Framengo', 'Fruminense', 'Basco', 'Botafogos', 'Americas'), vitorias =c(3, 1, 2, 0, 1)) banco2
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.
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:
e uma referência
https://www.statology.org/fuzzy-matching-in-r/