Ошибка повторного использования при использовании stringdist и data.table в R

Я пытаюсь выполнить приблизительное сопоставление строк для таблицы 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).

Еще немного информации о входных данных и подходе:

  1. Author_corrected_df - это таблица данных, содержащая столбцы: «Автор» и «Автор_ исправлено». Author_Corrected - это алфавитное представление соответствующего автора (например: если Author = Jack123, то Author_Corrected = Jack).
  2. Столбец Author_Corrected может иметь варианты собственного имени, например: Jackk вместо Jack, и я хотел бы указать соответствующий пол в этом author_corrected_df под названием Gender_Dict.
  3. Другая таблица data.table с именем first_names_dict содержит «имя» (то есть имя) и пол (0 для женщин, 1 для мужчин, 2 для связей).
  4. Я хотел бы найти наиболее подходящее совпадение из «Author_Corrected» для каждой строки с учетом «имени» в first_names_dict и указать соответствующий пол (любой из 0,1,2).
  5. Чтобы сделать соответствие строки более строгим, я использую порог 0,9720, иначе позже в коде (не показан ниже) несоответствующие значения будут представлены как NA.
  6. Доступ к 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).

Был бы признателен за помощь с точки зрения понимания того, где находится ошибка, и есть ли более быстрый способ выполнить такого рода сопоставление (хотя последний является вторым приоритетом).

Заранее спасибо.


person ds_newbie    schedule 12.06.2019    source источник
comment
Привет, я предлагаю вам добавить print(max_sim1) и print(row_idx1) сразу после определения этих переменных.   -  person cbo    schedule 12.06.2019
comment
Привет, cbo, я попытался добавить операторы печати к переменным, но не смог понять, насколько это полезно. Пример вывода выглядит так: 1 114654 1 114654 0,95 0,9333333 0,9333333 0,925 0,9142857 0,93 0,8933333 Но я все равно получаю ту же ошибку, что и выше.   -  person ds_newbie    schedule 13.06.2019
comment
Это подтверждает 6 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.2019
comment
Вы можете проверить row_idx1 и распечатать, где могут быть проблемы, и взять только одно значение из всего индекса (например, с помощью статистики).   -  person cbo    schedule 13.06.2019


Ответы (1)


Следуя предыдущим комментариям, здесь я выбираю пол, который больше всего присутствует в вашем выборе:

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

                # Analysis of factor gender
                gender <- as.character( first_names_dict$gender[row_idx1] )

                # I take the (first) gender most present in selection 
                df_count <- as.data.frame( table(gender) )
                ref <- as.character ( df_count$test[which.max(df_count$Freq)] )
                value <- unique ( test[which(test == ref)] )

                # Affecting single character value to data frame
                author_corrected_df$Gender_Dict[ijk] <- value
        }
}

Надеюсь это поможет :)

person cbo    schedule 13.06.2019
comment
Согласитесь, что в "вопросе" много совпадений для одного и того же автора. следовательно, я изменил свой код, чтобы теперь сохранять результаты stringsim в виде таблицы data.table с двумя столбцами: сначала как текущий индекс / счетчик, а затем как показатель сходства для конкретного автора, затем я сортирую эту таблицу data.table в в порядке убывания оценки сходства и оставить только первую строку. Я предполагаю, что при этом будет сохраняться только один экземпляр в каждом случае даже нескольких совпадающих записей. Но все равно возникает та же ошибка. В этот раз проверю, что не работает! Спасибо cbo за ваше решение, я тоже попробую! - person ds_newbie; 13.06.2019
comment
Хорошо, это похоже на то, что я делаю с df_count. Вы также можете использовать другую статистику, кроме max, заменяя wich.max в `ref‹ - as.character (df_count $ test [which.max (df_count $ Freq)]) `. Ваше здоровье ! - person cbo; 13.06.2019