2016-08-29 15 views
2

Я пытаюсь создать уникальный столбец идентификатора, используя пакет RecordLinkage. Я успешно это сделал при работе с меньшими наборами данных (< = 1,000,000), но не смог воспроизвести этот результат для более крупных наборов данных (> 1,000,000), которые используют разные (но похожие) функции в пакете. Мне даны несколько переменных идентификатора, для которых я хочу создать уникальный идентификатор, несмотря на то, что могут быть некоторые ошибки (близкие совпадения) или дубликаты в записях.Создание уникального столбца идентификатора для большого набора данных с пакетом RecordLinkage

Учитывая некоторый кадр данных идентификаторов:

data(RLdata500) 
df_identifiers <- RLdata500 

Это код для меньших datesets (которые работают):

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

# this code writes an "ID" column that is the same for similar identifiers 
classify <- matches %>% arrange(ID.1) %>% filter(!duplicated(ID.2)) 
df_identifiers$ID_prior <- df_identifiers$ID 

# merge matching information with the original data 
df_identifiers <- left_join(df_identifiers, matches %>% select(ID.1,ID.2), by=c("ID"="ID.2")) 

# replace matches in ID with the thing they match with from ID.1 
df_identifiers$ID <- ifelse(is.na(df_identifiers$ID.1), df_identifiers$ID, df_identifiers$ID.1) 

Этот подход обсуждается here. Но при использовании других функций этот код не может быть расширяемым при применении к более крупным наборам данных. Например, большой эквивалент данных compare.dedup является RLBigDataDedup, чья RLBigData поддержка класса аналогичных функций, таких как epiWeights, epiClassify, getPairs и т.д. Замены compare.dedup с RLBigDataDedup не работает в этой ситуации.

Рассмотрим следующую попытку для больших наборов данных:

df_identifiers <- df_identifiers %>% mutate(ID = 1:nrow(df_identifiers)) 
rpairs <- RLBigDataDedup(df_identifiers) 
p=epiWeights(rpairs) 
(. . .) 

Здесь, оставшийся код почти идентичен первому. Хотя epiWeights и epiClassify работают над классом RLBigData, как и ожидалось, getPairs нет. Функция getPairs не использует аргумент show = "links". Из-за этого весь последующий код не работает.

Есть ли другой подход, который необходимо предпринять для создания столбца уникальных идентификаторов при работе с более крупными наборами данных в классе RLBigData, или это просто ограничение?

ответ

0

Во-первых, импортировать следующие библиотеки:

library(RecordLinkage) 
library(dplyr) 
library(magrittr) 

Рассмотрим эти примеры наборов данных из пакета RecordLinkage:

data(RLdata500) 
data(RLdata10000) 

предположим, что мы заботимся об этих соответствующих переменных и порога:

matching_variables <- c("fname_c1", "lname_c1", "by", "bm", "bd") 
threshold <- 0.5 

Рекордная привязка для наборов данных SMALL выглядит следующим образом:

RLdata <- RLdata500 
df_names <- data.frame(RLdata[, matching_variables]) 
df_names %>% 
    compare.dedup() %>% 
    epiWeights() %>% 
    epiClassify(threshold) %>% 
    getPairs(show = "links", single.rows = TRUE) -> matching_data 

Здесь, следующий небольшой манипуляции с данными, могут быть применены для добавления соответствующих идентификаторов к данному набору данных (такой же код из here):

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

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

RLdata <- RLdata10000 
df_names <- data.frame(RLdata[, matching_variables]) 
df_names %>% 
    RLBigDataDedup() %>% 
    epiWeights() %>% 
    epiClassify(threshold) %>% 
    getPairs(filter.link = "link", single.rows = TRUE) -> matching_data 

Здесь, следующие крупные манипуляции с данными, могут быть применены для добавления соответствующих идентификаторов в данном набор данных (похожи на код из here):

RLdata_ID <- left_join(mutate(df_names, ID = 1:nrow(df_names)), 
         select(matching_data, id.1, id.2) %>% 
         arrange(id.1) %>% filter(!duplicated(id.2)), 
         by = c("ID" = "id.2")) %>% 
    mutate(ID = ifelse(is.na(id.1), ID, id.1)) %>% 
    select(-id.1) 
RLdata$ID <- RLdata_ID$ID