首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建关系矩阵?

如何创建关系矩阵?
EN

Stack Overflow用户
提问于 2019-10-20 07:00:01
回答 1查看 108关注 0票数 0

我有以下数据:

代码语言:javascript
复制
client_id <- c(1,2,3,1,2,3)
product_id <- c(10,10,10,20,20,20)
connected <- c(1,1,0,1,0,0)
clientID_productID <- paste0(client_id,";",product_id) 
df <- data.frame(client_id, product_id,connected,clientID_productID)

  client_id product_id connected clientID_productID
1         1         10         1               1;10
2         2         10         1               2;10
3         3         10         0               3;10
4         1         20         1               1;20
5         2         20         0               2;20
6         3         20         0               3;20

目标是生成一个关系矩阵:

代码语言:javascript
复制
  client_id product_id clientID_productID client_pro_1_10 client_pro_2_10 client_pro_3_10 client_pro_1_20 client_pro_2_20 client_pro_3_20
1         1         10               1;10               0               1               0               0               0               0
2         2         10               2;10               1               0               0               0               0               0
3         3         10               3;10               0               0               0               0               0               0
4         1         20               1;20               0               0               0               0               0               0
5         2         20               2;20               0               0               0               0               0               0
6         3         20               3;20               0               0               0               0               0               0

换句话说,当product_id等于10时,客户端1和客户端2是连接的。重要的是,我不希望客户端1与自己连接。当为product_id=20时,我只有一个客户端,这意味着没有连接,所以我应该只有零。

更具体地说,我试图创建的是一个关系的方阵,在列中包含客户/产品的所有组合。一个客户只有在购买了相同的产品时才能与另一个客户连接。

我已经搜索了一大堆代码,并尝试了其他代码。这个问题与其他已经回答的问题之间的区别在于,我希望保留我的3号客户,即使她从未购买过任何产品。我想表明她与任何其他客户都没有关系。现在,我可以通过按产品(How to create relational matrix in R?)堆叠关系来创建矩阵,但我正在努力寻找一种不堆叠它们的方法。

如果问题不够具体,或者太具体,我道歉。无论如何,感谢你,stackoverflow是初学者的救命稻草。

EN

回答 1

Stack Overflow用户

发布于 2019-10-20 13:53:10

我想我已经弄明白了。

不过,这肯定不是最优雅的答案。

代码语言:javascript
复制
client_id <- c(1,2,3,1,2,3)
product_id <- c(10,10,10,20,20,20)
connected <- c(1,1,0,1,0,0)
clientID_productID <- paste0(client_id,";",product_id) 
df <- data.frame(client_id, product_id,connected,clientID_productID)

df2 <- inner_join(df[c(1:3)], df[c(1:3)], by = c("product_id", "connected"))

df2$Source <- paste0(df2$client_id.x,"|",df2$product_id)
df2$Target <- paste0(df2$client_id.y,"|",df2$product_id)
df2 <- df2[order(df2$product_id),]

indices = unique(as.character(df2$Source))

mtx <- as.matrix(dcast(df2, Source ~ Target, value.var="connected", fill=0))
rownames(mtx) = mtx[,"Source"]
mtx <- mtx[,-1]
diag(mtx)=0

mtx = as.data.frame(mtx)
mtx = mtx[indices, indices]

我得到了我想要的结果:

代码语言:javascript
复制
     1|10 2|10 3|10 1|20 2|20 3|20
1|10    0    1    0    0    0    0
2|10    1    0    0    0    0    0
3|10    0    0    0    0    0    0
1|20    0    0    0    0    0    0
2|20    0    0    0    0    0    0
3|20    0    0    0    0    0    0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58468695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档