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