使用 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_phone
和 cluster_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 行。如果有更好的方法,请告诉我。
我有以下数据集:
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_phone
和 cluster_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 行。如果有更好的方法,请告诉我。