【问题标题】:How do I identify unique people under 1 id number when they are represented under different identifiers当他们以不同的标识符表示时,如何识别 1 个 ID 号下的唯一人员
【发布时间】:2021-06-11 19:07:41
【问题描述】:

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

如果人“A”使用电子邮件“A”和电话“A”

而人“B”使用电子邮件“A”和电话“B”

而人“C”使用电子邮件“B”和电话“B”

我想推断出 Person 'A' = Person 'B' = Person 'C' 即使标识符有所不同。

下面是一个示例表

起点:

first name last name email phone street address
j jackson jj@gmail 12 619 Lilac
jon jackson jj@gmail 34
jon jackson jj@yahoo 34
Mariah jackson maj@gmail 45 619 Lilac
Katy Herring katy@yahoo 67
Dalia Smith ds@gmail 89 439 Sycamore
Dalia Smith ds@yahoo 439 Sycamore

期望的结果:

first name last name email phone street address unique customer
j jackson jj@gmail 12 619 Lilac 1
jon jackson jj@gmail 34 1
jon jackson jj@yahoo 34 1
Mariah jackson maj@gmail 45 619 Lilac 2
Katy Herring katy@yahoo 67 3
Dalia Smith ds@gmail 89 439 Sycamore 4
Dalia Smith ds@yahoo 439 Sycamore 4

最终,我想找到一个地方来查看家庭交易,因此可以将与孩子 (Dalia Smith/Dalia Smith jr) 具有相同姓名和电话号码的父母视为相同的唯一客户暂且。此外,我正在使用的地址更具体,因此我可以访问适当的数字来破译具有相同街道地址的人。

【问题讨论】:

  • 希望您的客户没有一个住在大型公寓楼中... 1 楼的杰克逊小姐可能不喜欢看到留在 15 楼的杰克逊先生的账单。 Dalia Junior 也可能不喜欢被当作她的祖母 Dalia Senior,即使他们住在跨代的房子里。
  • 另外,如果有人有儿子或女儿,并且使用自己的电子邮件进行交流,这不会产生预期的结果。 (如果客户不是其他人,为什么要注册两次?)
  • 您在问题中包含了“r”标签,所以假设您是 R 用户?不妨试试reclin 包之类的东西,它实现了概率记录链接方法并且非常易于使用。

标签: sql r postgresql


【解决方案1】:

这是完成我认为您在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多