繁体   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