Здесь может быть использована либо базовая функция R adist
, либо функция stringdist::amatch
.Нет смысла превращать ваш словарь в data.frame
, поэтому у меня его нет.
Если вы хотите поэкспериментировать, вы можете использовать разные методы для пакета stringdist, хотя здесь по умолчанию работает отлично.Обратите внимание, что для обеих функций выбрано наилучшее совпадение, но если нет близкого совпадения (как определено параметром maxDist), то возвращается NA.
library(stringdist)
# Using stringdist package
clean_places <- function(places, dictionary, maxDist = 5) {
dictionary[amatch(places, dictionary, maxDist = maxDist)]
}
# Using base R
clean_places2 <- function(places, dictionary, maxDist = 5) {
sm <- adist(places, dictionary)
sm[sm > maxDist] <- NA
dictionary[apply(sm, 1, which.min)]
}
dictionary <- c("Pondichéry", "Lorient", "Port-Louis", "Nantes", "Brest")
place1 <- c("pondichery ", "Pondichery", "Pondichéry", "Port-Louis", "Port Louis ")
place2 <- c("Lorent", "Pondichery", " Lorient", "port-louis", "Port Louis")
place3 <- c("Loirent", "Pondchéry", "Brest", "Port Louis", "Nantes")
clean_places(place1, dictionary)
# [1] "Pondichéry" "Pondichéry" "Pondichéry" "Port-Louis" "Port-Louis"
clean_places(place2, dictionary)
# [1] "Lorient" "Pondichéry" "Lorient" "Port-Louis" "Port-Louis"
clean_places(place3, dictionary)
# [1] "Lorient" "Pondichéry" "Brest" "Port-Louis" "Nantes"
clean_places2(place1, dictionary)
# [1] "Pondichéry" "Pondichéry" "Pondichéry" "Port-Louis" "Port-Louis"
clean_places2(place2, dictionary)
# [1] "Lorient" "Pondichéry" "Lorient" "Port-Louis" "Port-Louis"
clean_places2(place3, dictionary)
# [1] "Lorient" "Pondichéry" "Brest" "Port-Louis" "Nantes"