使用 R 基于多个变量对数据进行聚类

Clustering data based on multiple variables using R

我有以下数据集:

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

其中每个唯一组合 phone 没有。并且电子邮件创建了一个唯一的customer_id。如果 phone no 或 email_id 重复,我会知道它属于同一个 customer.I 想要使用可能的 phone 号码组合为所有这些客户创建一个唯一的 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 实现此目的?

编辑

按照你的解释,我就那么做了。

我模拟了数据

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

上一篇Post(我理解错了)

我个人会使用 dplyr 库并按以下步骤进行。假设您的数据存储在 df 变量中。例如,我会只考虑 phone 数字并公开具有几个不同 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.

进行分组

我不确定这是否是您要查找的内容,但如果不是,请发表评论,以便我可以编辑和调整代码。

下面的代码给出了我想要的结果。让我们称我的示例数据集为 'd'.

**> `

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
}



**
`

最终数据集:

cust_id phone   email   ID  ID1
1   A   X   1   1
2   A   Y   1   1
3   A   Z   1   1
4   B   X   1   1
5   B   P   1   1
6   B   Q   1   1
7   C   P   1   1
8   C   R   1   1
9   C   S   1   1

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