使用 RecordLinkage 包为大型数据集生成唯一 ID 列
Generating a unique ID column for large dataset with the RecordLinkage package
我正在尝试使用 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
class支持类似epiWeights
、epiClassify
、getPairs
,等等。在这种情况下用 RLBigDataDedup
替换 compare.dedup
不起作用。
考虑以下针对大型数据集的尝试:
df_identifiers <- df_identifiers %>% mutate(ID = 1:nrow(df_identifiers))
rpairs <- RLBigDataDedup(df_identifiers)
p=epiWeights(rpairs)
( . . . )
到这里,剩下的代码和第一个几乎一样。尽管 epiWeights
和 epiClassify
按预期在 RLBigData
class 上工作,但 getPairs
却没有。函数 getPairs
不使用 show = "links"
参数。因此,所有后续代码都不起作用。
在 RLBigData
class 中处理较大的数据集时,是否需要采用不同的方法来生成一列唯一 ID,或者这只是一个限制?
首先,导入以下库:
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
在这里,可以应用以下小型数据操作将适当的 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
在这里,可以应用以下大型数据操作将适当的 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
我正在尝试使用 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
class支持类似epiWeights
、epiClassify
、getPairs
,等等。在这种情况下用 RLBigDataDedup
替换 compare.dedup
不起作用。
考虑以下针对大型数据集的尝试:
df_identifiers <- df_identifiers %>% mutate(ID = 1:nrow(df_identifiers))
rpairs <- RLBigDataDedup(df_identifiers)
p=epiWeights(rpairs)
( . . . )
到这里,剩下的代码和第一个几乎一样。尽管 epiWeights
和 epiClassify
按预期在 RLBigData
class 上工作,但 getPairs
却没有。函数 getPairs
不使用 show = "links"
参数。因此,所有后续代码都不起作用。
在 RLBigData
class 中处理较大的数据集时,是否需要采用不同的方法来生成一列唯一 ID,或者这只是一个限制?
首先,导入以下库:
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
在这里,可以应用以下小型数据操作将适当的 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
在这里,可以应用以下大型数据操作将适当的 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