我有类似于这两个邻接矩阵的数据:
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有一个链接。
请注意,在2000年,节点D和C有一个链接。
根据这些信息,我想构建一个新的邻接矩阵(包含我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年没有返回,反之亦然。
有什么想法吗?
答案 0 :(得分:1)
在图论中,两个邻接点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 - &gt; 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