Нечеткое сопоставление / объединение двух фреймов данных названий университетов

У меня есть список названий университетов с орфографическими ошибками и несоответствиями. Мне нужно сопоставить их с официальным списком названий университетов, чтобы связать мои данные.

Я знаю, что нечеткое сопоставление / соединение - это мой путь, но я немного растерялся от правильного метода. Любая помощь будет принята с благодарностью.

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"))

1 ответ

Решение

Я использую 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() использует расстояние Левенштейна для сравнения сходства между двумя строками.

Другие вопросы по тегам