Я пытаюсь выполнить приблизительное сопоставление строк для таблицы data.table, содержащей имена авторов, на основе словаря «первых» имен. Я также установил высокий порог, скажем, выше 0,9, чтобы улучшить качество сопоставления.
Однако я получаю сообщение об ошибке, приведенное ниже:
Warning message:
In [`<-.data.table`(x, j = name, value = value) :
Supplied 6 items to be assigned to 17789 items of column 'Gender_Dict' (recycled leaving remainder of 5 items).
Эта ошибка возникает, даже если я округляю совпадение схожести до 4 цифр с помощью signif (similarity_score, 4).
Еще немного информации о входных данных и подходе:
- Author_corrected_df - это таблица данных, содержащая столбцы: «Автор» и «Автор_ исправлено». Author_Corrected - это алфавитное представление соответствующего автора (например: если Author = Jack123, то Author_Corrected = Jack).
- Столбец Author_Corrected может иметь варианты собственного имени, например: Jackk вместо Jack, и я хотел бы указать соответствующий пол в этом author_corrected_df под названием Gender_Dict.
- Другая таблица data.table с именем first_names_dict содержит «имя» (то есть имя) и пол (0 для женщин, 1 для мужчин, 2 для связей).
- Я хотел бы найти наиболее подходящее совпадение из «Author_Corrected» для каждой строки с учетом «имени» в first_names_dict и указать соответствующий пол (любой из 0,1,2).
- Чтобы сделать соответствие строки более строгим, я использую порог 0,9720, иначе позже в коде (не показан ниже) несоответствующие значения будут представлены как NA.
- Доступ к first_names_dict и author_corrected_df можно получить по приведенной ниже ссылке:
for (ijk in 1:nrow(author_corrected_df)){
max_sim1 <- max(stringsim(author_corrected_df$Author_Corrected[ijk], first_names_dict$name, method = "jw", p = 0.1, nthread = getOption("sd_num_thread")), na.rm = TRUE)
if (signif(max_sim1,4) >= 0.9720){
row_idx1 <- which.max(stringsim(author_corrected_df$Author_Corrected[ijk], first_names_dict$name, method = "jw", p = 0.1, nthread = getOption("sd_num_thread")))
author_corrected_df$Gender_Dict[ijk] <- first_names_dict$gender[row_idx1]
} else {
next
}
}
Во время выполнения я получаю следующее сообщение об ошибке:
Warning message:
In `[<-.data.table`(x, j = name, value = value) :
Supplied 6 items to be assigned to 17789 items of column 'Gender_Dict' (recycled leaving remainder of 5 items).
Был бы признателен за помощь с точки зрения понимания того, где находится ошибка, и есть ли более быстрый способ выполнить такого рода сопоставление (хотя последний является вторым приоритетом).
Заранее спасибо.
print(max_sim1)
иprint(row_idx1)
сразу после определения этих переменных. - person cbo   schedule 12.06.20196 items to be assigned to 17789
, вам нужно отображение 1 на 1. Проверьте, есть ли у вас несколько максимумов, запустив код без цикла (например, с ijk ‹- 1). Затем проверьте выводmax_sim1
,max(stringsim(author_corrected_df$...
,which.max(stringsim(author_corrected_df$...
,author_corrected_df$Gender_Dict[ijk]
,first_names_dict$gender[row_idx1]
. - person cbo   schedule 13.06.2019row_idx1
и распечатать, где могут быть проблемы, и взять только одно значение из всего индекса (например, с помощью статистики). - person cbo   schedule 13.06.2019