问题描述
我有一个igraph,其中有几个断开的组件.例如:
I have an igraph with several disconnected components. For example:
library(igraph)
g <- simplify(
graph.compose(
graph.ring(10),
graph.star(5, mode = "undirected")
)
) + edge("7", "8")
在此示例中,节点9是其自己的图,节点7和8也是其自己的图,其余部分形成了第三图.
In this example, node 9 is its own graph, as are nodes 7 and 8, and the rest form a third graph.
我想将它们分开处理,所以我想将单个igraph转换为3个igraph的列表(按连通性拆分).
I'd like to treat these separately, so I want to convert the single igraph into a list of 3 igraphs (split by connectedness).
我破解了一些代码来实现此目的,但是它效率低下而且相当糟糕.
I hacked some code to achieve this, but it's inefficient and fairly awful.
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)
是否有一种更清晰的图分割方法?
Is there a cleaner way of splitting the graph?
推荐答案
您可以使用以下方法来计算图形的连接部分:
You could calculate the connected components of your graph by using:
clusters(g)
# $membership
# [1] 1 1 1 1 1 1 2 2 3 1
#
# $csize
# [1] 7 2 1
#
# $no
# [1] 3
或者您可以使用以下方法为图形的每个组成部分创建单独的图形:
Or you could create a separate graph for each component of your graph by using:
dg <- decompose.graph(g) # returns a list of three graphs
plot(dg[[1]]) # plot e.g. the 1st one
这篇关于如何将一个igraph拆分为连接的子图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!