Очистка большого количества введенных вручную имен людей в R - PullRequest
1 голос
/ 23 января 2020

Мне дали указание сгруппировать набор данных по продажам по имени продавца для работы.

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

Набор данных выглядит примерно так (не их настоящие имена):

reprex_days <- seq(1,22,1)
reprex_sales <- rnorm(22, mean=100, sd=50)
reprex_names<- c("Abby Davies", "Abby Davies", "Abby Davies", "Abby  Davis", "Abi Davies", "abby davies", NA,
                 "simon", "Simon Jenkins", "Simon Jenkins", "Simon Jenkins", "Simon   Jenkins", "Simon jenjins",
                 "Toby Jones", "Toby Jones", "toby jones", "toby jones", "toby jonse", "toby", NA, NA, NA)

reprex <- data.frame(cbind(reprex_days, reprex_sales, reprex_names))
names(reprex) <-c("day_ID", "sales", "salesperson")
reprex$sales <- as.numeric(reprex$sales)

Если я пытаюсь сгруппировать продавцом явно дублируется из-за нескольких версий имени каждого продавца, присутствующего в данных:

reprex_grouped <- reprex %>%
  group_by(salesperson) %>%
  summarise(total_sales = sum(sales),
            mean_sales = mean(sales),
            days_active = n())

reprex_grouped

дает:

   # A tibble: 13 x 4
   salesperson     total_sales mean_sales days_active
   <fct>                 <dbl>      <dbl>       <int>
 1 Abby  Davis              12       12             1
 2 abby davies              14       14             1
 3 Abby Davies              31       10.3           3
 4 Abi Davies                3        3             1
 5 simon                    20       20             1
 6 Simon   Jenkins           5        5             1
 7 Simon jenjins            13       13             1
 8 Simon Jenkins            46       15.3           3
 9 toby                     18       18             1
10 toby jones               25       12.5           2
11 Toby Jones               17        8.5           2
12 toby jonse                6        6             1
13 NA                       43       10.8           4

Я планирую использовать str_remove () и toLower (), чтобы удалить все лишние пробелы и учесть различия в регистре, и я знаю, что я никогда не смогу успешно идентифицировать сотрудников, когда они только ввели свои имена (иногда есть несколько человек с одним первым имя) или не смогли ничего ввести.

Однако мне интересно, существует ли какой-либо способ автоматического определения того, где имя на один или два символа отличается от другой записи, и изменения его на то, что будет первым в наборе данных ( для этого не имеет значения, правильно ли написано их имя, а не многие ли их продажи относятся к одному человеку)? (например, «Тоби Джонс» c .f. «Тоби Джонс», «Саймон Дженджинс» c .f. «Саймон Дженкинс», «Эбби Дэвис» c .f. «Эбби Дэвис»)

Кто-нибудь знает о расширенном пакете распознавания строковых шаблонов, который может сделать что-то подобное?

Я не могу сделать это вручную, потому что слишком много имен, и потому что компания хочет повторно использовать код для будущие продажи с разными сотрудниками. (Я не могу изменить систему идентификации; у него нет бюджета, чтобы нанимать кого-то для управления разрешениями базы данных, чтобы они не могли реализовать традиционную систему входа в систему.)

1 Ответ

1 голос
/ 23 января 2020

Это не идеально, однако, хорошим вариантом может быть функция phonetic() из библиотеки stringdist:

reprex %>%
 group_by(ID = phonetic(salesperson)) %>%
 mutate(salesperson2 = first(salesperson))

   day_ID sales salesperson   ID    salesperson2 
   <fct>  <dbl> <fct>         <chr> <fct>        
 1 1         10 Abby Davies   A131  Abby Davies  
 2 2         13 Abby Davies   A131  Abby Davies  
 3 3         14 Abby Davies   A131  Abby Davies  
 4 4         19 Abby  Davis   A131  Abby Davies  
 5 5         22 Abi Davies    A131  Abby Davies  
 6 6          7 abby davies   A131  Abby Davies  
 7 7         18 <NA>          <NA>  <NA>         
 8 8          2 simon         S550  simon        
 9 9          1 Simon Jenkins S552  Simon Jenkins
10 10        11 Simon Jenkins S552  Simon Jenkins
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...