【问题标题】:How to create relational matrix?如何创建关系矩阵?
【发布时间】:2019-10-19 23:00:00
【问题描述】:

我有以下数据:

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 是初学者的救星。

【问题讨论】:

  • 现在您只是要求我们用定制的教程重写教科书/手册并完成您的(家庭)作业,而您没有表现出任何研究或其他努力。需求转储不是主题问题。请参阅How to Ask,点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。展示您可以做的相关部分并解释您遇到的第一个问题。请在代码问题中提供minimal reproducible example。这包括明确的规范和解释以及您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)

标签: matrix relational


【解决方案1】:

我相信我想通了。

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

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    0

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2017-08-11
    • 2014-06-04
    相关资源
    最近更新 更多