Obtenga las cadenas más cercanas que coincidan
Hola, estoy tratando de encontrar una cadena en otra cadena en diferentes marcos de datos y obtener las n coincidencias más cercanas basadas en la puntuación.
Por ejemplo, desde la cadena 2 (df2), necesito encontrar coincidencias con la cadena 1 (df1) y obtener las 3 coincidencias más cercanas según cada grupo ID.
ID = c(100, 100,100,100,103,103,103,103,104,104,104,104)
string_1 = c("Jack Daniel","Jac","JackDan","steve","Mark","Dukes","Allan","Duke","Puma Nike","Puma","Nike","Addidas")
df_1 = data.frame(ID,string_1)
ID = c(100, 100, 185, 103,103, 104, 104,104)
string_2 = c("Jack Daniel","Mark","Order","Steve","Mark 2","Nike","Addidas","Reebok")
df_2 = data.frame(ID,string_2)
Mi marco de datos de salida, df_out, se verá así:
ID = c(100, 100,185,103,103,104,104,104)
string_2 = c("Jack Daniel","Mark","Order","Steve","Mark 2","Nike","Addidas","Reebok")
nearest_str_match_1 = c("Jack Daniel","JackDan","NA","Duke","Mark","Nike","Addidas","Nike")
nearest_str_match_2 = c("JackDan","Jack Daniel","NA","Dukes","Duke","Addidas","Nike","Puma Nike")
nearest_str_match_3 = c("Jac","Jac","NA","Allan","Allan","Puma","Puma","Addidas")
df_out = data.frame(ID,string_2,nearest_str_match_1,nearest_str_match_2,nearest_str_match_3)
He intentado hacerlo manualmente con el paquete “stringdist” utilizando el método ‘jw’ para obtener el valor más cercano.
stringdist::stringdist("Jack Daniel","Jack Daniel","jw")
stringdist::stringdist("Jack Daniel","Jac","jw")
stringdist::stringdist("Jack Daniel","JackDan","jw")
Gracias de antemano.
davy.ai
Para resolver este problema utilizando
dplyr
y el paquetestringdist
, primero necesitaremos unirdf_1
ydf_2
basándonos en la columna comúnID
. A continuación, utilizaremos la funciónstringdist
para calcular la distancia entre cada cadena de texto en las columnasdf_1$string_1
ydf_2$string_2
. Por último, ordenaremos el data frame resultante por distancia y nos quedaremos con las 3 mejores coincidencias para cada grupo deID
.Aquí tienes una solución de código para este problema:
Resultado:
Como puedes ver, el data frame resultante
df_out
coincide con el resultado deseado. Para cada grupo deID
, tenemos el valor destring_2
y las 3 mejores coincidencias en la columnastring_1
. También incluimos algunas lógicas adicionales que manejan casos en los que la coincidencia exacta está incluida en las 3 mejores coincidencias (nearest_str_match_1
es la coincidencia exacta,nearest_str_match_2
es la primera alternativa,nearest_str_match_3
es la segunda alternativa).