选择包含特定叶节点的子图(igraph)

3

我有一个像这样的图:

一个示例图

我需要提取图中只包含从根节点(n2)到红色叶子节点的所有路径的一部分。我发现在R中可以通过以下命令提取节点的邻居,如n6和n7:

level = 2
subg1 <- graph.neighborhood(cGraph, level, "n6", mode=c('in'))
subg2 <- graph.neighborhood(cGraph, level, "n7", mode=c('in'))

然后合并 subg1 和 subg2。

但问题是: 1. 我的条件是直到达到像 n2(根)这样的节点,而不是层级。

%%%%%%%%%%%%%%%%%%%%%%%%%

我也尝试了以下方法,但存在两个问题:

finalshortest = get.all.shortest.paths(finalSubg1, c("n2"), to = V(finalSubg1)[color=="red"],mode="out")
for (p in finalshortest$res) {
    finalsubgraph <- graph.union(induced.subgraph(finalSubg1,V(finalSubg1)[p]), finalsubgraph)
    finalsubgraph <- graph.union(subgraph.edges(finalSubg1,E(finalSubg1,path=p)), finalsubgraph)
}
plot(finalsubgraph)
  1. get.all.shortest.paths不能给出所有路径,只能给出最短路径。例如,图中有从n2到n6的两条路径。
  2. 最终的图不具备原始图的相同属性。

请帮助大家,谢谢!

2个回答

3

最后我找到了它:

finalshortest = all_simple_paths(cGraph, from = c("n2"), to = V(cGraph)[color=="red"],mode="out")
V(cGraph)$keep <- "NO"
for (p in finalshortest) { V(cGraph)[p]$keep <- "YES" }
finalsubgraph<-induced.subgraph(cGraph, which(V(cGraph)$keep=="YES"))

感谢您的帮助,Tamas。

1
抱歉,您的问题没有完全说明。首先您说需要“提取仅包含红叶的图的一部分”。显然,这个图仅包含n6和n7节点(因为只有它们是红色的)。由于您接着说“应该删除n1、n3和n5节点”,看起来您实际上想要一个包含n6和n7之间最短路径的图,忽略边的方向。如果这确实是您想要的,那么使用get.shortest.path函数找到n6和n7之间的最短路径,然后使用induced.subgraph提取仅包含n6和n7之间最短路径上的节点的子图即可。

1
谢谢您的指导。我已经纠正了我的句子。您能否再检查一下? - TryToBeNice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接