нечеткое совпадение в R, чтобы связать идентификатор с именем - PullRequest
0 голосов
/ 24 марта 2020

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

Чтобы сделать это, Я написал следующий код. Первые две строки генерируют образец данных того типа, с которым я работаю. Тем не менее, он всегда копирует идентификатор первой записи (123) после имени каждого. Я просмотрел этот код десятки раз. Я не понимаю, что может быть не так. Кто-нибудь может мне помочь?

df <- data.frame(id = c("123", "345", "678", "910"), pattern = c("john hopkins", "lady crocombe", "linda john", "dennis mitchell"), stringsAsFactors = F)

source_df <- data.frame(string = c("jon hopkins", "linda jon", "", "dennis mitchel", "lady croco"), stringsAsFactors = F)

patterns <- df$pattern

for(i in 1:ncol(source_df)){
  if(nchar(source_df$string[i]) > 0){
    match <- agrep(source_df$string[i], patterns, max.distance = 0.1)
    if(length(match) > 0 && length(match) < 2) {
      source_df$string_id[i] <- df$id[match]
    } else {
      source_df$string_id[i] <- ""
    }
  } else {
    source_df$string_id[i] <- ""
  }
}

Сначала я проверяю, содержит ли ячейка, с которой я сопоставляю, какие-либо символы. Если нет, оставьте поле id пустым.

Затем я запускаю нечеткое совпадение и спрашиваю, есть ли уникальный выход (если совпадения нет или несколько совпадений, игнорируем и оставляем поле id пустым).

Если есть уникальный вывод, получите из agrep, какая это строка, и скопируйте идентификатор из этой строки в новое поле идентификатора.

Это дает следующий вывод:

1   jon hopkins     123
2   linda jon       123
3                   123
4   dennis mitchel  123
5   lady croco      123

Это должно дать:

1   jon hopkins     123
2   linda jon       345
3                   
4   dennis mitchel  910
5   lady croco      678

Что я делаю не так?

...