3

我有一个如下的 DAG。

library(igraph)
library(visNetwork)

nodes <- data.frame(key = c("B", "A", "C", "C1", "C2", "C3", "X", "P", "Y", "M", "N", "O", 
                            "G3", "G2", "G1", "G", "R", "S", "K1", "K2", "K3", "Z", "H", "I"),
                    inter = c(0, 0, 0, 1, 1, 1, 1, 4, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 
                              1, 1, 0, 0),
                    ret = c("F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "T", "F", 
                            "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F"))

edges <- data.frame(from = c("A", "C", "C1", "C2", "C3", "X", "M", "N", "O", "G3", "G2", 
                             "G1", "G", "R", "Z", "P", "K1", "K2", "O", "P", "B", "Y", "S", 
                             "X", "B"),
                    to = c("C", "C1", "C2", "C3", "X", "P", "Y", "M", "N", "O", "G3", 
                           "G2", "G1", "G", "R", "K1", "K2", "K3", "H", "I", "C", "P", "G", 
                           "H", "I"))

ig <- graph_from_data_frame(d = edges, directed = TRUE, vertices = nodes)

is.dag(ig)
[1] TRUE

igv <- visIgraph(igraph = ig, layout = "layout_with_sugiyama")

visNodes(igv, shape = "circle", value = 30)

在此处输入图像描述

我试图通过合并几个节点来简化图表。

要保留的顶点

1) 叶子

leaves <- which(degree(ig, v = V(ig), mode = "out")==0, useNames = T)

离开 K3 21

2)明确指定由节点属性(“ ret”)保留

nodes[nodes$ret == "T",]$key
[1] "N"

要合并的顶点

将一个节点与前面的节点合并,直到它匹配一个

1) 根或

2)具有>1条边指向它的节点或

3) 明确指定一个

在此示例中,将合并以下节点。同时还需要添加属性的值。

{P, K1, K2, K3} = K

{C, C1, C2, C3, X} = X

{G, G1, G2, G3, O} = O

{N, M, Y} = Y

sum(nodes[nodes$key %in% c("P", "K1", "K2", "K3"), ]$inter)
[1] 7
sum(nodes[nodes$key %in% c("C", "C1", "C2", "C3", "X"), ]$inter)
[1] 4
sum(nodes[nodes$key %in% c("G", "G1", "G2", "G3", "O"), ]$inter)
[1] 3
sum(nodes[nodes$key %in% c("N", "M", "Y"), ]$inter)
[1] 3

如何找到这样的节点组并将它们与数据合并,同时不干扰要保留的节点?

4

0 回答 0