使用igraph将矩阵转为加权边列表时出现边值缺失问题
问题原因
igraph包的graph.adjacency()函数默认将邻接矩阵中值为0或NA的单元格识别为不存在对应边,转换为边列表时会直接丢弃这类条目。
你测试用的随机矩阵由runif()生成,所有值都在(0,1)区间内没有0值,因此10×10的矩阵可以得到100条完整边。而你使用的161×161的sim矩阵中存在6333个值为0或NA的单元格,因此最终生成的边列表只有19628行。
验证方法
运行如下代码即可确认:
# 统计sim矩阵中非0且非NA的单元格数量 sum(sim != 0, na.rm = TRUE)
运行结果应等于19628,即可证明是上述原因导致行数缺失。
解决方案
如果你需要保留所有25961条边(包括值为0的边),最稳妥的方式是直接手动转换邻接矩阵为边列表,不需要依赖igraph的转换逻辑:
# 生成全量边列表 df1 <- expand.grid(from = rownames(sim), to = colnames(sim)) # 将矩阵值映射为边权重 df1$weight <- as.vector(sim) # 验证行数 dim(df1)
如果确实需要通过igraph实现转换,可以先临时替换矩阵中的0值为特殊占位符,转换完成后再恢复原值即可:
sim_temp <- sim # 将0值临时替换为不会和正常权重冲突的极小值 sim_temp[sim_temp == 0] <- -99999 g1 <- graph.adjacency(sim_temp, weighted = TRUE) df1 <- get.data.frame(g1) # 恢复0值 df1$weight[df1$weight == -99999] <- 0
内容的提问来源于stack exchange,提问作者Chris T.
相关产品推荐
相关产品推荐

