2017-02-15 56 views
2

頂點的相互邊這應該是簡單的數字,但我想獲得在我的圖中所有的頂點相關相互邊的數量:查找的igraph R中

library(igraph) 
ed <- data.frame(from = c(1,1,2,3,3), to = c(2,3,1,1,2)) 
ver <- data.frame(id = 1:3) 
gr <- graph_from_data_frame(d = ed,vertices = ver, directed = T) 
plot(gr) 

Graph

我知道我可以使用which_mutual的邊緣,但有用於獲取這樣的等效的命令:

# vertex edges no_mutual 
#  1  2   2 
#  2  1   1 
#  3  2   1 

UDPATE:更正輸出表中的不一致如emilliman5指出

回答

0

這裏是一個班輪解決方案:

> table(unlist(strsplit(attr(E(gr)[which_mutual(gr)],"vnames"),"\\|")))/2 

1 2 3 
2 1 1 

它依賴於獲得邊界列表中每個邊的頂點名稱都是「vnames」屬性,是一個「|」分隔的字符串。然後它就會分裂,然後給你一張包含所有相互邊緣頂點的表格,每個邊緣每邊出現兩次,然後除以二。

如果從邊緣列表中獲取頂點名稱的方法不太簡單,我敢肯定Gabor知道它。

下面是詳細那招:

爲了您的圖形gr

> E(gr) 
+ 5/5 edges (vertex names): 
[1] 1->2 1->3 2->1 3->1 3->2 

你可以得到頂點的邊緣這樣的:

> attr(E(gr),"vnames") 
[1] "1|2" "1|3" "2|1" "3|1" "3|2" 

所以我的一行亞羣邊緣列出我的相互性標準,然後操縱字符串。

0

我不確定這將如何擴展,但它會完成工作。您預計表中有一些不一致的地方,所以我做盡我所能,即頂點2只有一個始發邊緣不2.

mutual_edges <- lapply(V(gr), function(x) which_mutual(gr, es = E(gr)[from(x) | to(x)])) 
df <- data.frame(Vertex=names(mutual_edges), 
       Edges=unlist(lapply(V(gr), function(x) length(E(gr)[from(x)]))), 
       no_mutual=unlist(lapply(mutual_edges, function(x) sum(x)/2))) 
df 

# Vertex Edges no_mutual 
#1  1  2   2 
#2  2  1   1 
#3  3  2   1