使用RecordLinkage包

时间:2016-08-29 21:03:41

标签: r duplicates record linkage data-linking

我正在尝试使用RecordLinkage包生成唯一的ID列。我在使用较小的数据集(< = 1,000,000)时已成功完成此操作,但无法为包中使用不同(但相似)函数的较大数据集(> 1,000,000)重现此结果。我有多个标识符变量,我想生成一个唯一的ID,尽管事件中可能存在一些错误(接近匹配)或重复记录。

给出标识符的一些数据框:

data(RLdata500)
df_identifiers <- RLdata500

这是较小的日期集(可以工作)的代码:

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类支持类似的功能,例如epiWeightsepiClassifygetPairs,在这种情况下,用compare.dedup替换RLBigDataDedup不起作用。

考虑以下对大型数据集的尝试:

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

这里,剩下的代码几乎与第一代相同。虽然epiWeightsepiClassify按预期在RLBigData类上工作,但getPairs却没有。函数getPairs不使用show = "links"参数。因此,所有后续代码都不起作用。

RLBigData类中使用较大的数据集时,是否需要采用不同的方法来生成一列唯一ID,或者这只是一个限制?

1 个答案:

答案 0 :(得分:1)

首先,导入以下库:

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

此处,可以应用以下SMALL数据操作来将适当的ID附加到给定数据集(来自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

LARGE数据集的等效代码如下:

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

此处,可以应用以下LARGE数据操作来将适当的ID附加到给定数据集(类似于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