![](/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.