[英]R igraph make “subgraph” from igraph object from list of vertices, infer edges between selected vertices if there are connected nodes in original
我正在使用来自 R 的 igraph。 我知道我们可以用选定的顶点制作一个子图,但是如果这些节点没有直接连接,那么新子图中就不会有边。 如果有其他节点(不是顶点列表的一部分)间接连接这两个节点,有没有办法制作一个在两个节点之间创建边的子图? 例如,如果我有一个具有以下边的图:EF FG 并且我的顶点列表包含 E 和 G,我如何创建一个创建该边 EG 的新子图? 谢谢!!!
找到两步之外的邻居的一种方法是将邻接矩阵与自身相乘(例如,请参见此处的注释)。
首先创建问题中描述的图表:
library(igraph)
g <- graph_from_literal(E--F, F--G)
然后取邻接矩阵( m
)并将其与自身相乘。
m <- get.adjacency(g, sparse = F)
m2 <- m %*% m
从生成的邻接矩阵构建新图并删除所有度数为 0 的顶点(无二度邻居):
g2 <- graph_from_adjacency_matrix(m2, diag = F, mode = "undirected")
induced_subgraph(g2, degree(g2) > 0)
#> IGRAPH 089bf67 UN-- 2 1 --
#> + attr: name (v/c)
#> + edge from 089bf67 (vertex names):
#> [1] E--G
使用reprex v2.0.2创建于 2022-08-26
根据评论中的建议,我得出:
require(igraph)
set.seed(1)
g <- erdos.renyi.game(2^6, 1/32)
V(g)$name <- seq(vcount(g))
filter <- c(7,22, 1, 4, 6)
amg <- g[] # adjacency matrix g
clg <- clusters(g)$membership # strongly connected components
amtc <- clg[row(amg)] == clg[col(amg)] # adjacency matrix of transitive closure
dim(amtc) <- dim(amg)
gtc <- simplify(graph.adjacency(amtc, mode="undirected")) # transitive closure of g
V(gtc)$name <- V(g)$name
isg <- induced_subgraph(gtc, filter)
plot(isg)
但是,如果 g 很大并且子图明显更小,则此解决方案不可行。
如果子图 << 原始图则:
require(igraph)
set.seed(1)
g <- erdos.renyi.game(2^6, 1/32)
V(g)$name <- seq(vcount(g))
filter <- c(7,22, 1, 4, 6)
clg <- components(g)$membership[filter] # strongly connected components
amfi <- outer(X=clg, clg, FUN = "==")*1 # cross product = 1, when equal
fitc <- simplify(graph.adjacency(amfi, mode="undirected")) # transitive closure of filter in g
plot(fitc)
在 Szabolcs 的基础上,请注意 connect(g, vcount(g)) 计算 g 的传递闭包。 但是不适合较大的图(vcount > 8192)。
require(igraph)
g <- make_graph(~ E-G, G-F)
fi <- c("E", "F")
system.time(tcg <- connect(g, vcount(g)) )
sg <- subgraph(tcg, V(tcg)[fi])
sg
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.