在R中查找igraph中顶点的相互边数

时间:2017-02-15 12:41:29

标签: r igraph vertex

这应该很简单,但我想获得与图中所有顶点相关的相互边数:

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所述

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这是一个单线解决方案:

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

1 2 3 
2 1 1 

它依赖于将edgelist中每个边的顶点名称作为&#34; vnames&#34;属性是&#34; |&#34; - 分隔的字符串。然后它会分裂,然后它会为你提供一个相互边缘的所有顶点的表格,每个顶点每个边缘出现两次,因此除以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"

所以我的单线子集边缘列出了我的相互性标准,然后操纵字符串。