R - определить потенциальные дубликаты записей, затем назначить один идентификатор - PullRequest
1 голос
/ 17 июня 2019

У меня есть таблица с несколькими тысячами «потенциальных» дубликатов людей, и задача состоит в том, чтобы идентифицировать эти потенциальные дубликаты и назначить им всем общий идентификатор.

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

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

 systemid    last_name
 --------    ---------
 13          Samison
 14          Samsun          
 15          Sanison

Я использую stringdist_inner_join для last_name, чтобы получить таблицу, которая выглядит следующим образом:

systemid.x    systemid.y
----------    ----------
13            15
14            13
15            13

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

finalid    systemid.x    systemid.y
-------    ----------    ----------
13         13            15
13         14            13
13         15            13

Чтобы сделать это более сложным, число этих потенциальных дубликатов может быть любым числом, а цепочка отношений между ними может быть любой длины.У меня может быть идентификатор 13 соответствует 14, 14 соответствует 15, 15 соответствует 21 и т. Д.

Возможно также, что я все делаю неправильно, и мне нужно изучить что-то еще, например сравнение.dedup.

1 Ответ

0 голосов
/ 18 июня 2019

Не уверен, что это лучший способ сделать это, но вот что я сделал:

Пример таблицы:

tbl1 <- tibble(userId = c(13, 14, 15, 16, 21)
               , lastName = c("Samison", "Samsun", "Sanison", "Simison", "Sumison"))

Сопоставить пары записей с использованием compare.dedup:

mapped.tbl1 <- compare.dedup(tbl1, exclude = "userId"
                               , strcmp = TRUE, strcmpfun = levenshteinSim) %>% 
    epiWeights() %>%
    epiClassify(0.7) %>%
    getPairs(show = "links", single.rows = TRUE) 

Группировка по столбцу lastName и удаление дубликатов

  mapped.tbl1 <- mapped.tbl1 %>% 
    group_by(lastName.2) %>% 
    mutate(rnk=order(order(desc(Weight)))) %>% 
    filter(rnk == 1) 

Присоедините мою исходную таблицу к моей сопоставленной таблице и обновите userId с помощью mutate:

  tbl1 <- tbl1 %>% 
    left_join(mapped.tbl1, by = c("userId" = "userId.2")) %>% 
    mutate(
      userId.2 = userId
      , userId = if_else(is.na(userId.1) == FALSE, userId.1, userId)
    ) %>% 
    select(names(tbl1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...