Использование RecordLinkage для добавления столбца с номером для каждого человека

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

Питер


Пример:

Питер

Питер

Питер

Коннор

Matt

станет

Пример:

Петр - 1

Петр - 1

Петр - 1

Коннор - 2

Мэтт - 3

library(RecordLinkage)
data(RLdata10000)
rpairs <- compare.dedup(RLdata10000, blockfld = 5)
p=epiWeights(rpairs)
classify <- epiClassify(p,0.7)
summary(classify)
match <- classify$prediction
results <- cbind(classify$pairs,match)

2 ответа

Небольшое переписывание, избегая того, что веса и классификатор должны быть настроены с идентификаторами,

df_names <- data.frame(Name=c("Peter","Peter","Peter","Connor","Matt"))

df_names %>% compare.dedup() %>%
             epiWeights() %>%
             epiClassify(0.3) %>%
             getPairs(show = "links", single.rows = TRUE) -> matches

left_join(mutate(df_names,ID = 1:nrow(df_names)), 
          select(matches,id1,id2) %>% arrange(id1) %>% filter(!duplicated(id2)), 
          by=c("ID"="id2")) %>%
    mutate(ID = ifelse(is.na(id1), ID, id1) ) %>%
    select(-id1)

Я разобрался с ответом на свой вопрос.

df_names <- df_names %>% mutate(ID = 1:nrow(df_names))
rpairs <- compare.dedup(df_names)
p=epiWeights(rpairs)
classify <- epiClassify(p,0.83)
summary(classify)
matches <- getPairs(classify, show = "links", single.rows = TRUE)

этот код записывает столбец "ID", который одинаков для одинаковых имен

matches <- matches %>% arrange(ID.1) %>% filter(!duplicated(ID.2))
df_names$ID_prior <- df_names$ID

объединить информацию о соответствии с исходными данными

df_names <- left_join(df_names, matches %>% select(ID.1,ID.2), by=c("ID"="ID.2"))

заменить совпадения в ID на то, с чем они совпадают из ID.1

df_names$ID <- ifelse(is.na(df_names$ID.1), df_names$ID, df_names$ID.1) 
Другие вопросы по тегам