agrep: solo devolver el (los) mejor (s) partido (s)

Estoy usando la función ‘agrep‘ en R, que devuelve un vector de coincidencias. Me gustaría una función similar a agrep que solo devuelve la mejor coincidencia, o las mejores coincidencias si hay vínculos. Actualmente, estoy haciendo esto usando la función ‘sdist ()’ del paquete ‘cba’ en cada elemento del vector resultante, pero esto parece muy redundante.

/ edit: aquí está la función que estoy usando actualmente. Me gustaría acelerarlo, ya que parece redundante calcular la distancia dos veces.

library(cba) word <- 'test' words <- c('Teest','teeeest','New York City','yeast','text','Test') ClosestMatch <- function(string,StringVector) { matches <- agrep(string,StringVector,value=TRUE) distance <- sdists(string,matches,method = "ow",weight = c(1, 0, 2)) matches <- data.frame(matches,as.numeric(distance)) matches <- subset(matches,distance==min(distance)) as.character(matches$matches) } ClosestMatch(word,words) 

El paquete RecordLinkage se eliminó de CRAN, use stringdist en su lugar:

 library(stringdist) ClosestMatch2 = function(string, stringVector){ stringVector[amatch(string, stringVector, maxDist=Inf)] } 

El paquete agrep usa Levenshtein Distances para hacer coincidir cadenas. El paquete RecordLinkage tiene una función C para calcular la distancia Levenshtein, que se puede usar directamente para acelerar su cálculo. Aquí hay una función de ClosestMatch que es alrededor de 10 veces más rápida

 library(RecordLinkage) ClosestMatch2 = function(string, stringVector){ distance = levenshteinSim(string, stringVector); stringVector[distance == max(distance)] }