【问题标题】:Need to generate Customer ID for transaction Data需要为交易数据生成客户 ID
【发布时间】:2019-11-11 11:13:57
【问题描述】:

我有一段时间内的客户交易数据,他们在一段时间内使用了多个电子邮件和电话号码。如何将所有电子邮件和电话号码关联到一个 ID。我当前的数据框采用以下格式

Name               Phone        Email
Ram                123456788    ram@gmail.com
Ram Fernandes      123456788    r1@live.com
Ram F              213456789    r1@live.com
Ram Fern           213456789    ram@msft.com
Matthews           123456798    Matt@msft.com

输出应该是这样的

ID      Name
Cust 1  Ram
Cust 1  Ram Fernandes
Cust 1  Ram F
Cust 1  Ram Fern
Cust 2  Matthews

【问题讨论】:

  • 您应用了哪些规则来定义单个客户 ID?
  • 嗨!请参阅stackoverflow.com/questions/42921674/…。我相信它可以满足您的需求^_^
  • @JorisChau 在这种情况下,记录 1 和 2 具有相同的电话不同的电子邮件,因此两者都是同一客户。在记录 2 和 3 之间,相同的电子邮件,所以现在 1,2 和 3 是同一个客户。现在 3 和 4 有数字。所以现在所有 1,2,3 和 4 都是同一个客户。
  • @BuffsGrad16 它的不同之处在于,在该示例中,学生值永远不会改变相同 id 的值。在此示例中可能会有所不同
  • 我认为您的问题本质上与here 所描述的问题非常相似。也许您可以采用这种基于图形的方法。

标签: r duplicates


【解决方案1】:

我们可以在"@" 之前提取电子邮件的第一部分以获取firstName,然后使用for 循环查看之前的任何条目是否具有相同的firstNamePhone。如果有匹配项,请使用 ID 或增加 ID 变量。

df$ID <- "Cust 1"
ind <- 1
df$firstName <- sub("(.*)@.*", "\\1", df$Email)

for (i in 2:nrow(df)) {
   if (with(df, is.na(Phone[i]) | Phone[i] == "" | Phone[i] == 0 | 
      is.na(firstName[i]) | firstName[i] == ""))
       df$ID[i] <- NA
   else {
   #check if current Phone or Firstname is similar to any of the previous entry
     inds <- with(df, Phone[i] == Phone[1:(i-1)] | 
                      firstName[i] == firstName[1:(i-1)])
     if (any(inds)) 
     #Get the ID of similar entry 
       df$ID[i] <- df$ID[which.max(inds)]
     else {
     #If there is no match then give a new ID
       ind = ind + 1
       df$ID[i] <- paste("Cust", ind)
     }
   }
}


df
#          Name     Phone         Email firstName     ID
#1          Ram 123456788 ram@gmail.com       ram Cust 1
#2 RamFernandes 123456788   r1@live.com        r1 Cust 1
#3         RamF 213456789   r1@live.com        r1 Cust 1
#4      RamFern 213456789  ram@msft.com       ram Cust 1
#5     Matthews 123456798 Matt@msft.com      Matt Cust 2

【讨论】:

  • 邮件的第一部分不必同名,可以是 ram@gmail.com 或 r123@gmail.com
  • @Pulkit 那么你打算如何识别相似的名字?
  • 我想像记录 1 和 2 一样关联它们,电话号码相同但电子邮件不同。现在记录 2 和 3 的电子邮件是相同的,以此类推记录 4。所以所有 1、2、3、4 记录都获得相同的 ID。我不关心名称是否正确,只给他们一个 id
  • @Pulkit 我明白了。我已经相应地更新了答案。您现在可以检查它是否适用于您的情况吗?
  • 它很好用,除非我的电子邮件或电话号码中有空格或 0,我想删除它们,如果其他可能有帮助,可能是另一个嵌套
猜你喜欢
  • 2018-08-09
  • 2017-03-17
  • 2014-03-03
  • 1970-01-01
  • 2021-11-29
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多