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

ret2) ノード属性 (" ")で保持することを明示的に指定

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

マージする頂点

一致するまでノードを先行するノードとマージします

1) ルート OR

2) 1 つ以上のエッジがそれに向けられているノード OR

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