Соответствие имени R - PullRequest
       55

Соответствие имени R

0 голосов
/ 15 ноября 2018

У меня есть 2 набора данных с именем. Один с точными именами, а другой с точными и измененными именами

dt_t <- data.table(Name = list("Aaron RAMSEY", "Mesut OEZIL", "Sergio AGUERO"))
dt_f <- data.table(Name = list("Özil Mesut", "Ramsey Aaron", "Kun Agüero"))

Я думал о создании таблицы с dt_t в строке и dt_f в столбце со значением функции jarowinkler (которая позволяет вычислять сходство строки), чтобы dt_f [i] был заменен на dt_t [i] который имеет наибольшее значение jarowinkler.

Но я не знаю, как это сделать, намного меньше, если это возможно.

Любая идея приветствуется

Спасибо

1 Ответ

0 голосов
/ 15 ноября 2018

Вот решение, использующее adist:

library(data.table)

dt_t <- data.table(Name = list("Aaron RAMSEY", "Mesut OEZIL", "Sergio AGUERO"))
dt_f <- data.table(Name = list("Özil Mesut", "Ramsey Aaron", "Kun Agüero"))

string_dist <- adist(dt_t$Name, dt_f$Name, partial=TRUE, ignore.case=TRUE)

match_idx <- apply(string_dist, 2, which.min)

dt_match <- cbind(dt_t, dt_f[match_idx])

Редактировать ---------------------------------

Применение по строкам:

library(data.table)

dt_t <- data.table(Name = (list("Aaron RAMSEY", "Mesut OEZIL", "Sergio AGUERO")))
dt_f <- data.table(Name = list("Özil Mesut", "Ramsey Aaron", "Kun Agüero"))

minDistMatch <- function(x, y){
  x <- as.list(x)
  y <- as.list(y)
  y[which.min(adist(x, y, partial=TRUE, ignore.case=TRUE))]
  }

dt_t[, Match := vapply(Name, minDistMatch, list(1L), dt_f$Name)]
...