Como realizar correspondência difusa em r (com exemplo)
Freqüentemente, você pode querer unir dois conjuntos de dados em R com base em strings que correspondem de forma imperfeita. Isso às vezes é chamado de correspondência difusa .
A maneira mais fácil de realizar correspondência difusa em R é usar a função stringdist_join() do pacote fuzzyjoin .
O exemplo a seguir mostra como usar esta função na prática.
Exemplo: correspondência difusa em R
Suponha que temos os dois quadros de dados a seguir em R que contêm informações sobre vários times de basquete:
#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
Agora, digamos que queremos fazer uma junção à esquerda , onde mantemos todas as linhas do primeiro quadro de dados e simplesmente as mesclamos com base no nome da equipe que mais corresponde no segundo quadro de dados.
Podemos usar o seguinte código para fazer isso:
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
O resultado é um quadro de dados contendo cada um dos cinco nomes de equipe originais do primeiro quadro de dados, bem como a equipe que mais se aproxima do segundo quadro de dados.
Nota nº 1 : optamos por usar a métrica de distância jw para correspondência. É a abreviação de distância Jaro-Winkler , que é uma métrica que mede a diferença entre duas strings.
Nota nº 2: usamos a função slice_min() do pacote dplyr para exibir apenas o nome da equipe do segundo quadro de dados que mais corresponde ao nome da equipe do primeiro quadro de dados.
Recursos adicionais
Os tutoriais a seguir explicam como realizar outras tarefas comuns em R:
Como mesclar vários quadros de dados em R
Como mesclar quadros de dados com base em múltiplas colunas em R