R - 基于其他邻接矩阵构造邻接矩阵

R - construct adjacency matrix based on other adjacency matrix

我的数据看起来类似于这两个邻接矩阵:

data1999 <- data.frame(node1=c("A", "A", "B", "D", "B", "C", "D"),
                   node2=c("A", "A", "D", "B", "B", "C", "D"),
                   link=c(1, 1, 1, 1, 1, 1, 1),
                   stringsAsFactors = FALSE)

adj.m1999 <- reshape2::acast(data1999, node1 ~ node2)

> adj.m1999
  A B C D
A 2 0 0 0
B 0 1 0 1
C 0 0 1 0
D 0 1 0 1


data2000 <- data.frame(node1=c("A", "A", "B", "C", "D", "C", "D"),
                   node2=c("A", "A", "B", "C", "D", "D", "C"),
                   link=c(1, 1, 1, 1, 1, 1, 1),
                   stringsAsFactors = FALSE)

adj.m2000 <- reshape2::acast(data2000, node1 ~ node2)

> adj.m2000
  A B C D
A 2 0 0 0
B 0 1 0 0
C 0 0 1 1
D 0 0 1 1

请注意,在 1999 年,节点 D 和 B 有一个 link。

请注意,在 2000 年,节点 D 和 C 有一个 link。

根据这些信息,我想构造一个新的邻接矩阵(包含我的 2000 条数据的所有节点),其中 B-D 和 D-B 的值为 1,其余为零:

> result
  A B C D
A 0 0 0 0
B 0 0 1 0
C 0 1 0 0
D 0 0 0 0  

在我的真实数据中,1999 年的数据可以有额外的节点,而 2000 年没有 return,反之亦然。

有什么想法吗?

在图论中,两个邻接矩阵 m1 和 m2 的乘积在位置 (i,j) 中给出了从 i 到 j 的路径数,首先通过 m1,然后通过 m2。这与您想要的有关,但不完全相同,如果我们这样做 adj.m1999 %*% adj.m2000,我们得到:

  A B C D
A 4 0 0 0
B 0 1 1 1
C 0 0 1 1
D 0 1 1 1

例如,您可以通过一种方式从 C 转到 D,即 C -> C,然后是 C -> D。 在您的示例中,您没有考虑对角线上的链接(或边),而且您的图表也不是定向的,因此,如果我正确理解您想要什么,您可以这样做:

## First make sure that you have in adj.m1999 only nodes that appear in adj.m2000:
adj.m1999 = adj.m1999[row.names(adj.m1999) %in% row.names(adj.m2000),colnames(adj.m1999) %in% colnames(adj.m2000)]
## Then turn both diagonals into zeros:
diag(adj.m1999) = 0
diag(adj.m2000) = 0
## Finally, get the sum of the two products
res = adj.m1999 %*% adj.m2000 + adj.m2000 %*% adj.m1999
  A B C D
A 0 0 0 0
B 0 0 1 0
C 0 1 0 0
D 0 0 0 0