我需要将非循环图划分为线性部分。每个部分将是由至少一个节点组成的线性路径。线性部分不能包含任何分支。
例如,这是一个示例图:
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)
在此图中,有4个线性部分:
1
3 -> 5
2 -> 4
6 -> 7
如何将图表划分为线性路径部分?
答案 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)
当然,您可以使用components
来获取连接的节点。