2017-08-09 239 views
0

我想在igraph中進行網絡分析,但在將數據集轉換爲邊緣列表(帶有權重)時存在一些問題,因爲給定的數量不同列。數據集看起來如下(當然要大得多):首先是主操作員ID(主操作員也可以是合夥人,反之亦然,因此Ids在鄰接中保持不變)挑戰在於合作伙伴的數量有所不同(從0到40)。使用igraph創建鄰接網絡矩陣(或列表)igraph

IdMain IdPartner1 IdPartner2 IdPartner3 IdPartner4 ..... 
1  4   3   2   NA 
2  3   1   NA   NA 
3  1   4   7   6 
4  9   6   3   NA 
. 
. 

我的問題是如何將其轉化成具有重量的邊緣名單這是無向(只是表達交互):

Id1 Id2 weight 
1 2 2 
1 3 2 
1 4 1 
2 3 1  
3 4 2 
. . 

有誰有什麼尖走的最好方法是什麼?提前謝謝了!

+0

你可以嘗試重新描述一下你的問題,使它更清楚你的數據集是什麼,以及你想如何將它轉換成圖表?我很難看到您提供的初始數據集將如何轉換爲您提供的鄰接矩陣或邊界列表。我可以看到鄰接矩陣和邊界列表描述了同一個圖,我只是沒有看到如何將初始數據轉換爲該圖。 –

+0

此外,即使這不是你問題的一部分,不管你使用鄰接矩陣還是邊緣列表來描述你的圖形,都不是一個任意的選擇,所以你應該考慮你的情況,哪一個更適合你https: //stackoverflow.com/questions/2218322/what-is-better-adjacency-lists-or-adjacency-matrices-for-graph-problems-in-c –

+0

謝謝@Slowloris,鑑於數據集的大小,我認爲是一個邊界列表更好。我現在編輯了這個問題,我希望有更多的清晰。 –

回答

1

這是一個經典的重塑任務。您可以使用reshape2包。

text <- "IdMain IdPartner1 IdPartner2 IdPartner3 IdPartner4 
1  4   3   2   NA 
2  3   NA   NA   NA 
3  1   4   7   6 
4  9   NA   NA   NA" 

data <- read.delim(text = text, sep = "") 

library(reshape2) 
data_melt <- reshape2::melt(data, id.vars = "IdMain") 
edgelist <- data_melt[!is.na(data_melt$value), c("IdMain", "value")] 

head(edgelist, 4) 
# IdMain value 
# 1  1  4 
# 2  2  3 
# 3  3  1 
# 4  4  9 
+0

非常感謝@TaylorH!這真的很好。有一件事我不清楚在我的問題(現在編輯)是交互的重量(邊緣列表與關聯的值)。有沒有辦法將它們考慮在內?對不起,增加的問題,再次感謝 –

+0

@ julia_3010你的權重如何看待你的數據? –

+0

結構如上,但有重複的交互或'主'/'合作伙伴'順序是相反的(例如'IdMain 1'與#3合作伙伴,在另一個項目中它又是一樣的或對於這種交互,'number 3'是'IdMain',如果這是有意義的話。 –