这应该很简单,但我想获得与图中所有顶点相关的相互边数:
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所述
答案 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"
所以我的单线子集边缘列出了我的相互性标准,然后操纵字符串。