2012-11-02 42 views
7

的關係被表示爲矩陣x這樣的:如何從R中的矩陣創建邊列表?

 A B C  D 
A  0 2 1  1 
B  2 0 1  0 
C  1 1 0  1 
D  1 0 1  0 

的條目指它們的連接的數量。 任何人都可以告訴我如何寫它作爲邊緣列表?謝謝! 我正在考慮把它寫爲邊緣名單,如:

A B 
A B 
A C 
A D 
B C 

但是,這是新銳榜的權利,如果我想創建一個網絡陰謀? 謝謝!

回答

19

使用igraph包:

x <- matrix(c(0,2,1,1,2,0,1,0,1,1,0,1,1,0,1,0), 4, 4) 
rownames(x) <- colnames(x) <- LETTERS[1:4] 

library(igraph) 
g <- graph.adjacency(x) 
get.edgelist(g) 

#  [,1] [,2] 
# [1,] "A" "B" 
# [2,] "A" "B" 
# [3,] "A" "C" 
# [4,] "A" "D" 
# [5,] "B" "A" 
# [6,] "B" "A" 
# [7,] "B" "C" 
# [8,] "C" "A" 
# [9,] "C" "B" 
# [10,] "C" "D" 
# [11,] "D" "A" 
# [12,] "D" "C" 

我也建議你花一些時間在http://igraph.sourceforge.net/index.html閱讀igraph的文檔,因爲你的很多問題,最近都是簡單的例子用法。

(作爲獎勵,plot(g)會回答您的其他問題How to plot relationships in R?

+0

非常感謝您的幫助!我正在閱讀您現在推薦的文件。 – user1787675

1

嘗試在reshape2使用melt

M <- matrix(c(0,2,1,1,2,0,1,0,1,1,0,1,1,0,1,0), 4, 4, dimnames=list(c("A","B","C","D"), c("A","B","C","D"))) 

eList <- NULL 
for (i in 1:nrow(M)){ 
    for (j in 1:ncol(M)) { 
    eList <- c(eList, rep(paste(dimnames(M)[[1]][i], dimnames(M)[[2]][j]), M[i,j])) 
    } 
} 

輸出

> eList 
[1] "A B" "A B" "A C" "A D" "B A" "B A" "B C" "C A" "C B" "C D" "D A" "D C" 
+0

您的解決方案反之亦然?我的意思是,如果我們有一個邊界列表,並希望通過你的方式將其轉換爲鄰接矩陣? – minoo

8

,然後刪除重== 0。如果不需要打印重量。只是刪除它。

x 
    sample1 sample2 sample3 sample4 
feature1  0  2  1  1 
feature2  2  0  1  0 
feature3  1  1  0  1 
feature4  1  0  1  0 

melt(x) 
    Var1 Var2 value 
1 feature1 sample1  0 
2 feature2 sample1  2 
3 feature3 sample1  1 
4 feature4 sample1  1 
5 feature1 sample2  2