我有一个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)

有没有更干净的方法来分割图表?

最佳答案

您可以使用以下方法计算图的连接部分:

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

关于r - 如何将一个igraph拆分为连接的子图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29730624/

10-10 20:14