2017-08-25 165 views
0

我有类似于这两个邻接矩阵数据:的R - 构建邻接矩阵基于其它邻接矩阵

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年数据的所有节点),其中BD和DB具有值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年不会返回,反之亦然。

任何想法?

+1

@lmo谢谢。我应该马上添加它。 –

+1

难道你不是故意说1999年的矩阵B和D有链接吗? – Lamia

+0

@Lamia哎呀。确实。这里迟到了。我纠正了错误。谢谢!! –

回答

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 - > 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