子集有向图
Subsetting Directed igraph
我正在使用 igraph 中的定向网络。下面是生成这样一个网络的一些代码:
# example graph
# install.packages(c("igraph"), dependencies = TRUE)
library(igraph)
set.seed(1)
g <- erdos.renyi.game(20, 1/20,directed=TRUE,loops=FALSE)
V(g)$name <- letters[1:20]
par(mar=rep(0,4))
plot(g)
我想提取该网络的子集,其中包括任意顶点以及指向该顶点的所有边和顶点,无论该连接的度数或距离如何。
这是我想要提取的经过 Photoshop 处理的示例,在本例中使用顶点 "E"。我想提取一个网络,其中包括所有标记为蓝色的顶点和连接的边。
看来 edge_connectivity
函数很适合这项任务。它有 source
和 target
考虑边缘方向的参数:
sapply(V(g) , function(v) if( v != 5){edge_connectivity(g, source=v, target=5)} else NA )
a b c d e f g h i j k l m n o p q r s t
1 0 0 0 NA 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
# set the retruned vector to the value named `e_con`
#then select the vertices
V(g)[ which(e_con >0)]
+ 4/20 vertices, named, from ba45ff0:
[1] a n r t
可以使用该列表恢复图形对象:
small_g <- delete_vertices( g, !V(g) %in% c(5, V(g)[ which(econ >0)] ))
plot( small_g)
而您要求的是边缘列表:
edges(small_g)
[[1]]
IGRAPH 11d63f6 DN-- 5 4 -- Erdos renyi (gnp) graph
+ attr: name (g/c), type (g/c), loops (g/l), p (g/n), name (v/c)
+ edges from 11d63f6 (vertex names):
[1] n->a t->a a->e r->e
除了@42-,我觉得distance
也可以。
> d = distances(g, to='e', mode='out')
> V(g)[which(!is.infinite(d) & d >0)]
+ 4/20 vertices, named:
[1] a n r t
简而言之,括号 returns 中的代码是从 e
到其他顶点具有非零和有限距离的顶点的索引。
您可以使用make_ego_graph
获取特定节点的邻域图。将顺序设置为顶点数(或 n-1)以允许遍历整个图。
make_ego_graph(g, order=length(V(g)), nodes="e", mode="in")
我认为这里给出的所有三个答案都很有用,但@Zhiya 的解决方案是我最终使用的解决方案(它似乎是计算速度最快的方法)。
也就是说,我确实最终使用了@42- 中的元素,因为我想要的输出是一个子集网络。以下是解决此问题的更改:
d = distances(g, to='e', mode='out')
vertices.to.delete <- row.names(d)[which(is.infinite(d))]
g1 <- igraph::delete.vertices(g, vertices.to.delete)
我正在使用 igraph 中的定向网络。下面是生成这样一个网络的一些代码:
# example graph
# install.packages(c("igraph"), dependencies = TRUE)
library(igraph)
set.seed(1)
g <- erdos.renyi.game(20, 1/20,directed=TRUE,loops=FALSE)
V(g)$name <- letters[1:20]
par(mar=rep(0,4))
plot(g)
我想提取该网络的子集,其中包括任意顶点以及指向该顶点的所有边和顶点,无论该连接的度数或距离如何。
这是我想要提取的经过 Photoshop 处理的示例,在本例中使用顶点 "E"。我想提取一个网络,其中包括所有标记为蓝色的顶点和连接的边。
看来 edge_connectivity
函数很适合这项任务。它有 source
和 target
考虑边缘方向的参数:
sapply(V(g) , function(v) if( v != 5){edge_connectivity(g, source=v, target=5)} else NA )
a b c d e f g h i j k l m n o p q r s t
1 0 0 0 NA 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1
# set the retruned vector to the value named `e_con`
#then select the vertices
V(g)[ which(e_con >0)]
+ 4/20 vertices, named, from ba45ff0:
[1] a n r t
可以使用该列表恢复图形对象:
small_g <- delete_vertices( g, !V(g) %in% c(5, V(g)[ which(econ >0)] ))
plot( small_g)
而您要求的是边缘列表:
edges(small_g)
[[1]]
IGRAPH 11d63f6 DN-- 5 4 -- Erdos renyi (gnp) graph
+ attr: name (g/c), type (g/c), loops (g/l), p (g/n), name (v/c)
+ edges from 11d63f6 (vertex names):
[1] n->a t->a a->e r->e
除了@42-,我觉得distance
也可以。
> d = distances(g, to='e', mode='out')
> V(g)[which(!is.infinite(d) & d >0)]
+ 4/20 vertices, named:
[1] a n r t
简而言之,括号 returns 中的代码是从 e
到其他顶点具有非零和有限距离的顶点的索引。
您可以使用make_ego_graph
获取特定节点的邻域图。将顺序设置为顶点数(或 n-1)以允许遍历整个图。
make_ego_graph(g, order=length(V(g)), nodes="e", mode="in")
我认为这里给出的所有三个答案都很有用,但@Zhiya 的解决方案是我最终使用的解决方案(它似乎是计算速度最快的方法)。
也就是说,我确实最终使用了@42- 中的元素,因为我想要的输出是一个子集网络。以下是解决此问题的更改:
d = distances(g, to='e', mode='out')
vertices.to.delete <- row.names(d)[which(is.infinite(d))]
g1 <- igraph::delete.vertices(g, vertices.to.delete)