如何将 igraph 拆分为连接的子图?
Posted
技术标签:
【中文标题】如何将 igraph 拆分为连接的子图?【英文标题】:How to split an igraph into connected subgraphs? 【发布时间】:2015-06-26 03:49:50 【问题描述】:我有一个带有几个断开连接的组件的 igraph。例如:
library(igraph)
g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")
在这个例子中,节点 9 是它自己的图,节点 7 和 8 也是,其余的组成第三个图。
我想分别处理这些,所以我想将单个 igraph 转换为 3 个 igraph 的列表(按连通性拆分)。
我破解了一些代码来实现这一点,但它效率低下而且相当糟糕。
split_graph_into_connected_subgraphs <- function(g)
adjacency_list <- get.adjlist(g)
connected_nodes <- lapply(
adjacency_list,
function(adjacent_nodes)
new_nodes <- out <- adjacent_nodes
# Keep finding nodes that are adjacent to ones we already know about,
# until we find no more
repeat
doubly_adjacent_nodes <- Reduce(union, adjacency_list[new_nodes])
new_nodes <- setdiff(doubly_adjacent_nodes, out)
if(length(new_nodes) == 0)
break
out <- union(out, new_nodes)
sort(out)
)
# Single value nodes should contain themselves, not be empty
connected_nodes <- ifelse(
vapply(adjacency_list, length, integer(1)) == 0,
seq_along(connected_nodes),
connected_nodes
)
# We don't care about repeats, just the unique graphs
connected_nodes <- unique(connected_nodes)
# Get the subgraph from each
lapply(
connected_nodes,
function(nodes) induced.subgraph(g, nodes)
)
list_of_subgraphs <- split_graph_into_connected_subgraphs(g)
lapply(list_of_subgraphs, plot)
有没有更简洁的分割图的方法?
【问题讨论】:
【参考方案1】:您可以使用以下方法计算图形的连通分量:
clusters(g)
# $membership
# [1] 1 1 1 1 1 1 2 2 3 1
#
# $csize
# [1] 7 2 1
#
# $no
# [1] 3
或者您可以使用以下方法为图表的每个组件创建一个单独的图表:
dg <- decompose.graph(g) # returns a list of three graphs
plot(dg[[1]]) # plot e.g. the 1st one
【讨论】:
这是否保证第一个组件总是最大的? @user538603 没有。但是,您可以通过vcount
订购结果并获得所需的结果。以上是关于如何将 igraph 拆分为连接的子图?的主要内容,如果未能解决你的问题,请参考以下文章