在R中的图中查找线性路径部分

时间:2016-04-04 09:06:10

标签: r graph igraph

我需要将非循环图划分为线性部分。每个部分将是由至少一个节点组成的线性路径。线性部分不能包含任何分支。

例如,这是一个示例图:

library(igraph); 
dor = data.frame( from = c(1, 1, 2, 3, 4, 5, 6), 
    to = c(2, 3, 4, 5, 6, 6, 7) )
g = graph_from_data_frame(dor)
plot(g)

Example graph

在此图中,有4个线性部分:

1
3 -> 5
2 -> 4
6 -> 7

如何将图表划分为线性路径部分?

1 个答案:

答案 0 :(得分:1)

我认为你想做的就是这个。如果节点有多个传入边,请删除所有传入边。如果节点具有多个传出边,请删除所有传出边。所以我提出的解决方案......计算事件边缘并删除它们,如果有太多的话。

## Your original data
library(igraph)
dor = data.frame( from = c(1, 1, 2, 3, 4, 5, 6), 
    to = c(2, 3, 4, 5, 6, 6, 7) )
g = graph_from_data_frame(dor)


g2 = g
TooManyOut = which(sapply(incident_edges(g2, V(g2), mode="out"), length) > 1)
for(TMO in TooManyOut) {
    g2 = delete_edges(g2, attr(incident_edges(g2, V(g2), mode="out")[[TMO]], "vnames"))
}
TooManyIn = which(sapply(incident_edges(g2, V(g2), mode="in"), length) > 1)
for(TMI in TooManyIn) {
    g2 = delete_edges(g2, attr(incident_edges(g2, V(g2), mode="in")[[TMI]], "vnames"))
}
plot(g2)

Reduced Graph

当然,您可以使用components来获取连接的节点。