使用R

时间:2018-01-25 08:51:51

标签: r cluster-analysis

我有以下数据集:

cust_ID Phone   Email
1   A   X
2   A   Y
3   A   Z
4   B   X
5   B   P
6   B   Q
7   C   P
8   C   R
9   C   S
每个独特的手机组合都没有。和电子邮件创建一个唯一的customer_id创建。如果电话号码或email_id重复,我会知道它属于同一个客户。我想使用可能的电话号码组合为所有这些客户创建一个唯一的ID。

cust_ID Phone   Email   ID
1   A   X   A-B-C
2   A   Y   A-B-C
3   A   Z   A-B-C
4   B   X   A-B-C
5   B   P   A-B-C
6   B   Q   A-B-C
7   C   P   A-B-C
8   C   R   A-B-C
9   C   S   A-B-C

如何使用R?

实现此目的

2 个答案:

答案 0 :(得分:0)

编辑

根据你的解释,我会这样做。

我模拟了数据

cust_ID=1:50
Phone=round(runif(n = 50,100,150))
Email=round(runif(n = 50,200,250))

以下概述了它的样子(这次我确定我理解正确)

cust_ID Phone Email
   1   100   246
   2   130   221
   3   114   216
   4   120   205
   5   149   247
   6   125   208

我计算了以下内容以获得finalID我认为您正在寻找的内容:

df=as.data.frame(cbind(cust_ID,Phone,Email))
ID_Phone=df%>%
  group_by(Phone)%>%
  mutate(PhoneID=first(cust_ID))%>%
  ungroup()


ID_mail=ID_Phone%>%group_by(Email)%>%
  mutate(finalID=first(PhoneID))%>%
  ungroup()

head(ID_mail%>%arrange(finalID),100)

这给出了结果

  cust_ID Phone Email PhoneID finalID
        1   100   246       1       1
        2   130   221       2       2
       36   109   221      17       2
       40   109   221      17       2
       43   143   221      11       2
        3   114   216       3       3
       41   115   216      41       3
        4   120   205       4       4
       45   122   205      45       4
        5   149   247       5       5

上一篇文章(我误解了)

我会亲自使用dplyr库并按以下步骤操作。假设您的数据存储在df变量中。例如,我会考虑电话号码并公开具有几个不同Email值的电话号码。我只关注Phone,但您可以使用Email然后群集cust_ID重复该操作

df %>% group_by(Phone) 
%>% summarise(
          vector = paste(Email, collapse="__"),
          cluster_similar_phone = paste(Cust_ID, collapse="__"))

此命令会为您提供具有唯一Phone值的数据框和相应的Email。根据你的例子,它应该给你类似

的东西
 Phone      vector   cluster_similar_phone 
  A         X__Y__Z  1__2__3
  B         X__P__Q  4__5__6
              ...

我可能会重复发送电子邮件,然后使用专栏cluster_similar_phonecluster_similar_email对最终cust_ID进行分组。

我不确定这是不是您要找的,但请注释,如果不是,我可以编辑和调整代码。

答案 1 :(得分:0)

以下代码为我提供了所需的结果。让我们调用我的样本数据集'd'。

Table PhoneBook
Field: FirstName, LastName, PhoneNumber, Address

最终数据集:

  

**> `

d<-d[order(d$cust_id),]

ID=d%>%
  group_by(email)%>%
  mutate(ID=first(cust_id))%>%
  ungroup()

ID<-ID[order(ID$ID),]

ID=ID%>%
  group_by(phone)%>%
  mutate(ID1=first(ID))%>%
  ungroup()

z=0
y=1


while (y!=0)
{ 
  for (i in 1:nrow(ID))

  {z<-z+ifelse(ID$ID[i]==ID$ID1[i],0,1)
  i=i+1
     }
  ID<-ID[order(ID$ID1),]

  ID=ID%>%
    group_by(email)%>%
    mutate(ID=first(ID1))%>%
    ungroup() 

  ID<-ID[order(ID$ID),]

  ID=ID%>%
    group_by(phone)%>%
    mutate(ID1=first(ID))%>%
    ungroup()

  y<-z
  z=0
}



**
`

我的原始数据集包含80k行。如果有更好的方法,请告诉我。