【问题标题】:How to find 'first' and 'last' vertex connected to vertex如何找到连接到顶点的“第一个”和“最后一个”顶点
【发布时间】:2017-09-21 03:27:47
【问题描述】:

假设我有一个如下的邻接矩阵:

library(igraph)
df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7))
g <- graph_from_data_frame(na.omit(df))

对于每个顶点,如何在有向路径中显示第一个和最后一个顶点?例如,顶点“4”从 6 开始,以 1 结束。(或者,获取该路径中所有顶点的列表也可以)。

【问题讨论】:

  • 所以你只想要进出的邻居?顶点 1 或顶点 8 的结果是什么?如果一个顶点连接到两个以上的其他顶点怎么办?也许检查neighbors() 功能。
  • 我想要每棵树的根/终端叶子。数据(应该)使得森林中的所有树木都只有一个根。

标签: r igraph


【解决方案1】:

考虑拓扑排序。对有向图进行拓扑排序将为您提供第一个和最后一个顶点。

对于 R,您可以使用 igraph 包中的拓扑排序方法。 http://igraph.org/r/doc/topo_sort.html

【讨论】:

    【解决方案2】:

    this answer 之后,我最终对森林进行了图分解,然后找出哪些顶点的出度等于 0,从而确定每棵树的根节点(对入度执行相同的操作顶点是终端,虽然我意识到我不需要这些信息——因此我没有将其标记为答案)。

    library(igraph)
    library(dplyr)
    
    df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7))
    edgelist_df <- na.omit(df)
    g <- graph_from_data_frame(edgelist_df)
    
    tree_to_df <- function(graph, forest_edgelist){
      # for a directed tree, find its root and assign that root to every
      # node in the tree's edgelist
    
      # `dplyr::filter` fails on the subset below, so we use base R
      tree_dat <- forest_edgelist[forest_edgelist$id %in% V(graph)$name,]
    
      root <- which(degree(graph, v = V(graph), mode = 'out') == 0, useNames = T)
      tree_dat$root <- names(root)
      return(tree_dat)
    }
    
    root_dat <-
       decompose.graph %>% # find connected subgraphs
       lapply(tree_to_df, forest_edgelist = edgelist_df) %>%
       bind_rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-03
      • 2011-06-30
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多