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