我有一个如下的 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
如何找到这样的节点组并将它们与数据合并,同时不干扰要保留的节点?