从指示关系的矩阵制作邻接矩阵

Making adjacency matrix from matrix indicating relations

我创建了一个矩阵 S,它描述了一个图形。它看起来像这样:

   [,1] [,2] [,3]
1     2    3    9
2     1   10    5
3     9    4    8
4     3    9    7
5    10    4   11
6    11    5   10
7     4    3    8
8     9    3    4
9     3    8    4
10    5    2   11
11    6    5   10

表示第3个顶点与第9、4、8个顶点相连。我的图表没有方向。我想创建一个邻接矩阵。例如第三行是:

[1,0,0,1,0,0,1,1,1,0,0]

我想创建一个 11x11 的零矩阵并逐行分析它。我的结果矩阵应该是对称的。但是我不能使用任何循环,“for”是被禁止的。我是数学家,对 R 完全陌生。我应该如何开始解决这个问题?

数据

S <- structure(c(2L, 1L, 9L, 3L, 10L, 11L, 4L, 9L, 3L, 5L, 6L, 3L, 
10L, 4L, 9L, 4L, 5L, 3L, 3L, 8L, 2L, 5L, 9L, 5L, 8L, 7L, 11L,
10L, 8L, 4L, 4L, 11L, 10L), .Dim = c(11L, 3L))

我想你可以试试下面的基本 R 代码

v <- rep(0,nrow(S))
C <- t(apply(S,1,function(k) replace(v,k,1)))
res <- +(t(C) + C >0)

给出的邻接矩阵为

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
 [1,]    0    1    1    0    0    0    0    0    1     0     0
 [2,]    1    0    0    0    1    0    0    0    0     1     0
 [3,]    1    0    0    1    0    0    1    1    1     0     0
 [4,]    0    0    1    0    1    0    1    1    1     0     0
 [5,]    0    1    0    1    0    1    0    0    0     1     1
 [6,]    0    0    0    0    1    0    0    0    0     1     1
 [7,]    0    0    1    1    0    0    0    1    0     0     0
 [8,]    0    0    1    1    0    0    1    0    1     0     0
 [9,]    1    0    1    1    0    0    0    1    0     0     0
[10,]    0    1    0    0    1    1    0    0    0     0     1
[11,]    0    0    0    0    1    1    0    0    0     1     0

如果您想使用 igraph,这是另一个选项

library(igraph)
df <- data.frame(from = rep(1:nrow(S), each = ncol(S)), to = c(t(S)))
res <- as_adjacency_matrix(
  simplify(
    graph_from_data_frame(
      df,
      directed = FALSE
    )
  ),
  sparse = FALSE
)

这给出了

   1 2 3 4 5 6 7 8 9 10 11
1  0 1 1 0 0 0 0 0 1  0  0
2  1 0 0 0 1 0 0 0 0  1  0
3  1 0 0 1 0 0 1 1 1  0  0
4  0 0 1 0 1 0 1 1 1  0  0
5  0 1 0 1 0 1 0 0 0  1  1
6  0 0 0 0 1 0 0 0 0  1  1
7  0 0 1 1 0 0 0 1 0  0  0
8  0 0 1 1 0 0 1 0 1  0  0
9  1 0 1 1 0 0 0 1 0  0  0
10 0 1 0 0 1 1 0 0 0  0  1
11 0 0 0 0 1 1 0 0 0  1  0

这是一个带有 row/column 赋值的选项

m1 <- matrix(0, nrow = nrow(S), ncol = max(S))
m1[cbind(rep(seq_len(nrow(S)), each = ncol(S)), c(t(S)))] <- 1
+(m1|t(m1))

-输出

#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
# [1,]    0    1    1    0    0    0    0    0    1     0     0
# [2,]    1    0    0    0    1    0    0    0    0     1     0
# [3,]    1    0    0    1    0    0    1    1    1     0     0
# [4,]    0    0    1    0    1    0    1    1    1     0     0
# [5,]    0    1    0    1    0    1    0    0    0     1     1
# [6,]    0    0    0    0    1    0    0    0    0     1     1
# [7,]    0    0    1    1    0    0    0    1    0     0     0
# [8,]    0    0    1    1    0    0    1    0    1     0     0
# [9,]    1    0    1    1    0    0    0    1    0     0     0
#[10,]    0    1    0    0    1    1    0    0    0     0     1
#[11,]    0    0    0    0    1    1    0    0    0     1     0

数据

S <- structure(c(2L, 1L, 9L, 3L, 10L, 11L, 4L, 9L, 3L, 5L, 6L, 3L, 
10L, 4L, 9L, 4L, 5L, 3L, 3L, 8L, 2L, 5L, 9L, 5L, 8L, 7L, 11L,
10L, 8L, 4L, 4L, 11L, 10L), .Dim = c(11L, 3L))