当一个身份证号码下的人用不同的标识符表示时,我如何识别他们



我试图通过提供唯一的标识符来确保所有相同的客户不会被表示为多个人。我正在处理的信息是事务性的,因此每个事务都可能在不同的时间记录不同的信息。

如果人员"A"使用电子邮件"A"和电话"A">

个人"B"使用电子邮件"A"和电话"B">

人员"C"使用电子邮件"B"和电话"B">

我想推断出人"A"=人"B"=人(C(,即使标识符有变化。

以下是示例表

起点:

电子邮件>街道地址jj@gmailjj@gmail[/td>jj@yahoo[/td>maj@gmailkaty@yahoods@gmailds@yahoo
名字 姓氏电话
j 杰克逊12619丁香
jon jackson34
jon jackson34
Mariah 杰克逊45619丁香
Katy Herring67
Dalia Smith89439 Sycamore
Dalia Smith439 Sycamore

这里有一种令人难以置信的暴力方式来实现我认为你在R中所追求的目标。基本上:

  1. 您需要找到电话号码、电子邮件和地址的每个唯一值。这可以通过unique()功能来实现

  2. 您需要找到与这些变量的每个唯一值匹配的所有行。这可以通过match()功能来实现

  3. 您必须使用条件逻辑反复比较行,以确定它们是否与任何其他行匹配。可能有一个更优雅的解决方案,但我不是一个优雅的人,所以我将使用双for()循环。

  4. 您必须为唯一的行解析任何NA值

下面是一个例子:

##Fake Data##
First_Names<-c("John", "J", "John", "Maria", "Maria", "M", "Carlos", "C", "Carlos")
Last_Names<-c("Smith", "Smith", "Jones", "Valesquez", "Hidalgo", "Hidalgo","Garcia", "Garcia", "Lopez")
Email<-c("js@mail.com", "js@mail.com", "jj@mail.com", "M.V@othermail.com", "M_Hidalgo@mail.com", "M.Hidalgo@mail.com", "C_G@othermail.com", "C_G@othermail.com", "Lopez.Carlos@mail.com")
Phone<-c("555-1111", "666-1111", "555-2222", "555-3333", "555-4444", "555-4444", "555-5555", "555-5555", "555-6666")
Address<-c("1 A st", "1 A st", "2 B st", "3 C st", "4 D st", "4 D st", "5 E st", "5 E st", "6 F st")
DF<-data.frame(First_Names=First_Names, Last_Names=Last_Names, Email=Email, Phone=Phone, Address=Address)
#List of all possible Emails, Phones, and Addresses
email<-unique(DF$Email)
phone<-unique(DF$Phone)
address<-unique(DF$Address)
#finding matching values#
email_match<-match(DF$Email,email)
phone_match<-match(DF$Phone,phone)
address_match<-match(DF$Address,address)
DF$email_match<-email_match
DF$phone_match<-phone_match
DF$address_match<-address_match
#Create a blank field for Unique ID
DF[,"UID"]<-NA
#Nasty Double, nested for loop to compare all three match variables
for(i in 1:(nrow(DF)-1)){
if(i==1){
DF$UID[i]<-1
}

for(j in 2:nrow(DF)){
if(!is.na(DF$UID[j])){
DF$UID[j]<-DF$UID[j]
}else{
if(DF$email_match[i]==DF$email_match[j]|
DF$phone_match[i]==DF$phone_match[j]|
DF$address_match[i]==DF$address_match[j]
){
DF$UID[j]<-i
}

}
}
}
##Find any non-matching values##
for(i in 1:length(DF$UID)){
tmp<-0
if(is.na(DF$UID[i])){
tmp<-tmp+1
DF$UID[i]<-max(DF$UID[-which(is.na(DF$UID))])+1
}
}
print(DF)

相关内容

最新更新