簡體   English   中英

在R中的igraph中找到頂點的相互邊數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM