У меня есть список введенных названий университетов с орфографическими ошибками и несоответствиями. Мне нужно сопоставить их с официальным списком названий университетов, чтобы связать мои данные вместе.
Я знаю, что нечеткое сопоставление / соединение - это мой путь, но я немного потерялся в правильном методе. Любая помощь будет принята с благодарностью.
d<-data.frame(name=c("University of New Yorkk", "The University of South
Carolina", "Syracuuse University", "University of South Texas",
"The University of No Carolina"), score = c(1,3,6,10,4))
y<-data.frame(name=c("University of South Texas", "The University of North
Carolina", "University of South Carolina", "Syracuse
University","University of New York"), distance = c(100, 400, 200, 20, 70))
И я хочу получить результат, в котором они были бы объединены как можно ближе.
matched<-data.frame(name=c("University of New Yorkk", "The University of South Carolina",
"Syracuuse University","University of South Texas","The University of No Carolina"),
correctmatch = c("University of New York", "University of South Carolina",
"Syracuse University","University of South Texas", "The University of North Carolina"))
Я использую adist()
для подобных вещей и имею небольшую функцию-оболочку под названием closest_match()
, которая помогает сравнивать значение с набором «хороших / разрешенных» значений.
library(magrittr) # for the %>%
closest_match <- function(bad_value, good_values) {
distances <- adist(bad_value, good_values, ignore.case = TRUE) %>%
as.numeric() %>%
setNames(good_values)
distances[distances == min(distances)] %>%
names()
}
sapply(d$name, function(x) closest_match(x, y$name)) %>%
setNames(d$name)
University of New Yorkk The University of South\n Carolina Syracuuse University
"University of New York" "University of South Carolina" "University of New York"
University of South Texas The University of No Carolina
"University of South Texas" "University of South Carolina"
adist()
использует Расстояние Левенштейна для сравнения сходства между двумя строками.
Я бы сохранил последнюю строку как переменную decoder
, а затем вызвал бы d$name <- decoder[d$name]
, чтобы перезаписать текущие значения новыми правильными совпадениями.
Я новичок в этом формате, и у меня есть быстрый вопрос. Как мне использовать этот вывод матрицы в последней строке кода? Я написал строку sapply в новый фрейм данных, и там нет. Я что-то напортачил?