2017-08-25 221 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