繁体   English   中英

R igraph 从顶点列表中的 igraph object 创建“子图”,如果原始节点中有连接的节点,则推断所选顶点之间的边

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM