2016-08-29 18 views
2

RecordLinkageパッケージを使用して一意のID列を生成しようとしています。小さなデータセット(< = 1,000,000)で作業しているときにはうまくいきましたが、パッケージ内で異なる機能を使用する大きなデータセット(> 1,000,000)に対してこの結果を再現できませんでした。私はレコードにいくつかのエラー(ほぼ一致)または重複があるかもしれないという事実にもかかわらず、一意のIDを生成したい複数の識別子変数が与えられています。識別子のいくつかのデータフレームが与えられるRecordLinkageパッケージで大きなデータセットの一意のID列を生成

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のビッグデータと同等のは、そのRLBigDataクラスのサポート同様の機能などRLBigDataDedupcompare.dedupの交換などepiWeightsepiClassifygetPairs、このような状況では動作しません、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の列を生成するために必要な別の方法はありますか、これは単なる制限ですか?

答えて

0

まず、以下のライブラリをインポートします。

data(RLdata500) 
data(RLdata10000) 

我々はこれらのマッチングの変数としきい値を気に仮定します:

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

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

はRecordLinkageパッケージからこれらの例のデータセットを考えてみましょう

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から同じコード)に適切なIDを付加するために適用することができる次のよう

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からのコードに類似)所与のデータセットに適切なIDを付加するために適用することができます。

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 
関連する問題