Ошибка рециркуляции при использовании stringdist и data.table в R - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь выполнить примерное сопоставление строк для таблицы данных, содержащей имена авторов на основе словаря «первых» имен. Я также установил высокий порог, скажем, выше 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» и «Author_Corrected». Author_Corrected представляет собой алфавитное представление соответствующего автора (например, если Author = Jack123, то Author_Corrected = Jack).
  2. Столбец Author_Corrected может содержать варианты правильного имени, например: Джек вместо Джека, и я хотел бы указать соответствующий пол в этом author_corrected_df с именем Gender_Dict.
  3. Другая таблица данных, называемая first_names_dict, содержит имя (то есть имя) и пол (0 для женщины, 1 для мужчины, 2 для связи).
  4. Я хотел бы найти наиболее релевантное совпадение из «Author_Corrected» для каждой строки относительно «name» в first_names_dict и заполнить соответствующий пол (любой из 0,1,2).
  5. Чтобы сделать сопоставление строк более строгим, я использую порог 0,9720, в противном случае позже в коде (не показан ниже) несопоставленные значения затем представлены как NA.
  6. First_names_dict и author_corrected_df доступны по ссылке ниже: https://wetransfer.com/downloads/6efe42597519495fcd2c52264c40940a20190612130618/0cc87541a9605df0fcc15297c4b18b7d20190612130619/6498a7
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).

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

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

1 Ответ

1 голос
/ 13 июня 2019

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

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
        }
}

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

...