我有以下数据:
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目标是生成一个关系矩阵:
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是初学者的救命稻草。
发布于 2019-10-20 13:53:10
我想我已经弄明白了。
不过,这肯定不是最优雅的答案。
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]我得到了我想要的结果:
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 0https://stackoverflow.com/questions/58468695
复制相似问题