如何从带索引矩阵生成指定规模的邻接矩阵?
问题背景
我有如下格式的矩阵:
[,1] [,2] [,3] [,4] [,5] [,6] [1,] 2 12 NA NA NA NA [2,] 1 3 7 13 NA NA [3,] 2 4 8 14 NA NA [4,] 3 5 9 15 NA NA .... .... .... [31870] .... .....
需要生成一个31870×31870规模的邻接矩阵:新矩阵的第1行仅第2、12列设为1,其余为0;其余行以此类推。理想方案需满足:
- 高效处理大规模数据
- 支持每行超过6个邻居的场景
- 适配不同维度的输入矩阵
过往尝试
我曾尝试以下方法但均未成功:
- 使用
ifelse()函数构建矩阵 - 遍历空二元矩阵逐个赋值
- 以"binary matrix"、"design matrix"、"adjacency matrix"为关键词查找方案,尝试将输入矩阵转换为边列表再生成邻接矩阵
最终解决方案
我通过嵌套for循环结合igraph包解决了问题,代码如下:
# 统计矩阵中非NA值的总数 nr_of_entries_adjacencies <- dim(matrix)[1] * dim(matrix)[2] # 初始化空矩阵用于存储所有邻接关系 init_edge_list <- matrix(data = NaN, nrow = nr_of_entries_adjacencies, ncol = 2) # 原问题关注每个节点的邻居数量,这里额外增加一个"邻居"代表节点自身(距离为0的情况) nr_of_neighbors_plus_one <- 7 for (row_nr in 1:dim(matrix)[1]) { print(row_nr) for (col_nr in 1:dim(matrix)[2]) { if (!is.na(matrix[row_nr,col_nr])) { edge_list_row_nr <- ((row_nr-1) * nr_of_neighbors_plus_one) + col_nr init_edge_list[edge_list_row_nr ,2] <- init_row_nan_padded[row_nr, col_nr] init_edge_list[edge_list_row_nr, 1] <- row_nr } } } # 移除包含NA值的行 edge_list <- na.omit(init_edge_list) # 转换为图数据框 graph_dataframe <- igraph::graph.data.frame(edge_list) # 转换为邻接矩阵(稀疏矩阵格式) adjacency_matrix <- igraph::get.adjacency(graph_dataframe,sparse=TRUE)
内容的提问来源于stack exchange,提问作者BasMts
相关产品推荐
相关产品推荐

