在R语言中构建邻接矩阵:客户博物馆访问数据处理问题咨询
嗨,我来帮你搞定这个邻接矩阵的构建问题!从你的visite_cliente数据来看,每一行记录了某个客户对某家博物馆的访问总次数,我们可以基于这个数据构建两种常用的邻接矩阵:客户之间的关联矩阵(衡量客户共同访问的博物馆情况),或者博物馆之间的关联矩阵(衡量博物馆被同一客户访问的重叠度)。下面分步骤给你具体方案:
解决方案:构建邻接矩阵
第一步:先把数据转成「客户×博物馆」的关联矩阵
首先我们需要把长格式的visite_cliente转换成宽格式,行是客户ID,列是博物馆名称,单元格值是该客户对对应博物馆的访问次数。这里用tidyr包的pivot_wider来实现:
# 如果没装tidyr先安装:install.packages("tidyr") library(tidyr) # 转换为宽格式,缺失值用0填充(表示该客户没访问过这个博物馆) cliente_museo_wide <- visite_cliente %>% pivot_wider(names_from = museo, values_from = x, values_fill = 0) # 把客户ID设为行名,方便后续矩阵操作 cliente_museo_matrix <- column_to_rownames(cliente_museo_wide, var = "CodCliente")
转换后你会得到一个矩阵,行是每个客户,列是每家博物馆,值是访问次数。
第二步:构建客户之间的邻接矩阵
如果你想衡量任意两个客户共同访问的博物馆总次数,直接用矩阵乘法即可:
# 客户间邻接矩阵:adj_cliente[i,j] 表示客户i和客户j共同访问的博物馆总次数 adj_cliente <- cliente_museo_matrix %*% t(cliente_museo_matrix)
如果你的需求是只统计共同访问过的博物馆数量(不管访问次数),可以先把矩阵转成0-1二进制矩阵(访问过=1,没访问=0),再计算:
# 转换为二进制矩阵 cliente_museo_binary <- ifelse(cliente_museo_matrix > 0, 1, 0) # 客户间二进制邻接矩阵:adj_cliente_binary[i,j] 是客户i和j共同访问的博物馆数量 adj_cliente_binary <- cliente_museo_binary %*% t(cliente_museo_binary)
比如你提供的前6条数据里,所有客户都访问了ABBAZIA DI FRUTTUARIA,那这些客户之间的二进制邻接值都是1,其他没交集的客户则为0。
第三步:构建博物馆之间的邻接矩阵
如果需要衡量任意两家博物馆被同一客户访问的总次数,只需要把上面的矩阵转置后相乘:
# 博物馆间邻接矩阵:adj_museo[i,j] 表示博物馆i和j被同一客户访问的总次数 adj_museo <- t(cliente_museo_matrix) %*% cliente_museo_matrix
同样,如果要统计共同访问的客户数量,用二进制矩阵计算:
adj_museo_binary <- t(cliente_museo_binary) %*% cliente_museo_binary
可选:用igraph包快速构建(适合后续做图分析)
如果你还需要做图可视化或者更复杂的网络分析,可以用igraph包直接从原始数据构建二分图,再投影出邻接矩阵:
# 如果没装igraph先安装:install.packages("igraph") library(igraph) # 构建客户-博物馆的二分图 g <- graph_from_data_frame(visite_cliente, directed = FALSE) # 标记节点类型:区分客户和博物馆 V(g)$type <- V(g)$name %in% as.character(visite_cliente$CodCliente) # 投影得到客户间的邻接矩阵 adj_cliente_igraph <- bipartite_projection(g, which = "true")$adjacency # 投影得到博物馆间的邻接矩阵 adj_museo_igraph <- bipartite_projection(g, which = "false")$adjacency
这样得到的邻接矩阵和前面的计算结果是一致的,同时你还可以直接用igraph的函数做网络可视化。
内容的提问来源于stack exchange,提问作者ianux22
相关产品推荐
相关产品推荐

