R语言构建网络报错邻接矩阵不对称,如何将数据转为对称邻接矩阵?
问题核心原因
- 你当前手持的
df2属于边列表格式(记录两两关联的用户对),并非邻接矩阵,直接以邻接矩阵类型导入工具包必然报错 - 代码存在变量名错误:你将边列表转矩阵后命名为
relationsp,但导入network对象时调用了不存在的mat变量 - 对称邻接矩阵对应无向网络,你代码中设置的
directed = TRUE是有向网络参数,逻辑本身冲突
完整解决代码
步骤1:清洗原始数据
原始df2的用户名带有多余空格,且前6行是自环数据,先做标准化处理:
# 加载所需包 library(network) library(statnet) library(dplyr) library(stringr) # 清洗边列表 df_clean <- df2 %>% # 移除第一列的行号,只保留两列用户名字段 select(-1) %>% # 清除所有用户名前后的多余空格 mutate(across(everything(), str_squish)) %>% # 重命名为标准边列表列名 rename(from = 1, to = 2) %>% # 过滤掉自环(自己指向自己的关联) filter(from != to)
步骤2:生成对称邻接矩阵
# 提取所有唯一节点名称 all_nodes <- unique(c(df_clean$from, df_clean$to)) node_num <- length(all_nodes) # 初始化空邻接矩阵 adj_matrix <- matrix(0, nrow = node_num, ncol = node_num, dimnames = list(all_nodes, all_nodes)) # 填充关联值,同时给对称位置赋值保证矩阵对称 for (i in 1:nrow(df_clean)) { u <- df_clean$from[i] v <- df_clean$to[i] adj_matrix[u, v] <- 1 adj_matrix[v, u] <- 1 } # 验证对称性,运行后返回TRUE即为符合要求的对称邻接矩阵 isSymmetric(adj_matrix)
步骤3:构建网络对象
net <- as.network(x = adj_matrix, directed = FALSE, # 对称矩阵对应无向网络,参数需改为FALSE loops = FALSE, matrix.type = "adjacency")
简化方案(igraph包)
如果使用igraph包可以直接用边列表构建无向网络,无需手动转换邻接矩阵:
library(igraph) # 直接用清洗后的边列表构建无向网络 igraph_net <- graph_from_data_frame(df_clean, directed = FALSE, vertices = all_nodes) # 需要邻接矩阵时随时调用即可 adj_matrix <- as_adjacency_matrix(igraph_net, sparse = FALSE)
内容的提问来源于stack exchange,提问作者user14269252
相关产品推荐
相关产品推荐

