要提取的鄰接矩陣轉換成一個列表,你可以做以下的(我產生一些假數據):
set.seed(42)
df <- data.frame(beginEdge = sample(1:10, 10, replace = TRUE),
endEdge = sample(1:10, 10, replace=TRUE),
pathNum = rep(c(1,2), each=5))
df
beginEdge endEdge pathNum
1 10 5 1
2 10 8 1
3 3 10 1
4 9 3 1
5 7 5 1
6 6 10 2
7 8 10 2
8 2 2 2
9 7 5 2
10 8 6 2
paths <- unique(df$pathNum) # get the paths to iterate through
如果我們讓節點因素,並設置的因子水平到所有節點在人口中,那麼將爲您網絡中的人口計算鄰接矩陣。我假設這裏的網絡是十個演員。如果您觀察到的數據包含您想要使用的所有節點,請將級別設置爲unique(c(df$beginEdge,df$endEdge))
,或者您喜歡的任何節點組。
df$beginEdge <- factor(df$beginEdge, levels=1:10)
df$endEdge <- factor(df$endEdge, levels=1:10)
我們現在整個的路徑列表中去,創造矩陣存儲它們作爲一個列表:
list.of.adj.mats <- lapply(paths, function(i){
matrix(as.numeric((
table(df$beginEdge[df$pathNum==i],
df$endEdge[df$pathNum==i])+
table(df$endEdge[df$pathNum==i],
df$beginEdge[df$pathNum==i]))>0),
nrow=length(levels(df$beginEdge)))})
list.of.adj.mats
[[1]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 1 1
[4,] 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 1 0 0 1
[6,] 0 0 0 0 0 0 0 0 0 0
[7,] 0 0 0 0 1 0 0 0 0 0
[8,] 0 0 0 0 0 0 0 0 0 1
[9,] 0 0 1 0 0 0 0 0 0 0
[10,] 0 0 1 0 1 0 0 1 0 0
[[2]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 0 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0
[5,] 0 0 0 0 0 0 1 0 0 0
[6,] 0 0 0 0 0 0 0 1 0 1
[7,] 0 0 0 0 1 0 0 0 0 0
[8,] 0 0 0 0 0 1 0 0 0 1
[9,] 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 1 0 1 0 0
非常感謝您的回覆。只要看看你的答案給出的鄰接矩陣,我相信它們應該沿對角線對稱。換句話說,條目[i,j] =條目[j,i]。這在你的回答中似乎不是這種情況? – user7512228
你給出的例子是計算一個無向鄰接矩陣,所以它沒有必要是對稱的 - 我生成的矩陣編碼了一個無向鄰接矩陣所需要的所有信息來表示路徑。但是,我編輯了代碼,以便在需要時生成對稱矩陣(儘管它使得它更加混亂)。 – gfgm
非常感謝,我應該提到我需要對稱的相鄰矩陣。 – user7512228