在 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

指出的输出 table 中的不一致

我不确定这会扩展到什么程度,但它可以完成工作。您预期的 table 有一些不一致,所以我已尽力而为,即顶点 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

这是一个 one-liner 解决方案:

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

1 2 3 
2 1 1 

它依赖于获取边列表中每条边的顶点名称,因为 "vnames" 属性是一个“|”分隔的字符串。然后它分裂,然后给你一个 table 的所有顶点在相互边上,每个顶点在每条边上出现两次所以除以二。

如果有更简单的方法从边列表中获取顶点名称,我相信 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"

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