У меня есть таблица с именами, которую я хочу заменить анонимными идентификаторами. У меня есть таблица, в которой уникальный идентификатор связан с каждым именем, но имена страдают от незначительных орфографических ошибок, поэтому я использую нечеткое совпадение, чтобы получить правильный идентификатор для правильного имени.
Чтобы сделать это, Я написал следующий код. Первые две строки генерируют образец данных того типа, с которым я работаю. Тем не менее, он всегда копирует идентификатор первой записи (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
Что я делаю не так?