![](/img/trans.png)
[英]igraph in R: efficiently count number of edges between multiple sets of vertices
[英]Find number of mutual edges of vertices in igraph in 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)
我知道我可以為邊緣使用which_mutual
,但是是否有等效的命令可以獲取如下內容:
# vertex edges no_mutual
# 1 2 2
# 2 1 1
# 3 2 1
UDPATE:糾正了emilliman5指出的輸出表中的不一致
我不確定這樣做的規模如何,但是可以完成工作。 您的預期表存在一些不一致,因此我盡了最大努力,即頂點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
這是一種單線解決方案:
> table(unlist(strsplit(attr(E(gr)[which_mutual(gr)],"vnames"),"\\|")))/2
1 2 3
2 1 1
它依賴於獲取邊緣列表中每個邊緣的頂點名稱,因為“ vnames”屬性是用“ |”分隔的字符串。 然后對其進行分割,然后為您提供一個包含相互邊緣中所有頂點的表,每個頂點在每個邊緣中出現兩次,因此除以2。
如果從邊緣列表中獲取頂點名稱的方法不那么怪異,我敢肯定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"
因此,我的邊緣的單線子集列出了我的互惠標准,然后操作了字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.