You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 05:06:04