Вершины контракта в igraph, когда пути к контракту - это перекрывающиеся множества вершин - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть igraph ig следующим образом.

library(igraph)

edges <- data.frame(from = c("X", "U", "V", "M", "G", "G1", "G2", "G3", "G4a", "G3", "G4b", 
                             "G5b", "H", "R", "R1", "R2", "O", "O1", "O2", "H", "Y", "N", 
                             "J", "K"),
                    to = c("G", "X", "U", "K", "G1", "G2", "G3", "G4a", "J", "G4b", "G5b", 
                           "H", "R", "R1", "R2", "O", "O1", "O2", "O3", "F", "G", "K", "R", 
                           "F"))

nodes <- data.frame(key = c("G", "X", "Y", "U", "V", "K", "M", "N", "G1", "G2", "G3", "G4a", 
                            "J", "G4b", "G5b", "H", "R", "R1", "R2", "O", "O1", "O2", "O3", 
                            "F"),
                    type = c("G", "D", "T", "D", "T", "G", "T", "T", "D", "D", "D", "D", 
                             "D", "D", "D", "D", "G", "D", "D", "D", "D", "D", "D", "G"),
                    f1 = c("X", "U", NA, "V", NA, "M", NA, NA, "G", "G1", "G2", "G3", 
                           "G4a", "G3", "G4b", "G5b", "H", "R", "R1", "R2", "O", "O1", "O2", 
                           "H"),
                    f2 = c("Y", NA, NA, NA, NA, "N", NA, NA, NA, NA, NA, NA, NA, NA, NA, 
                           NA, "J", NA, NA, NA, NA, NA, NA, "K"),
                    inter = c(0, 1, NA, 1, NA, 0, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 
                              1, 1, 1, 1, 0))

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

enter image description here

Мне нужно заключить следующие пути.

tocontract <- list(c("U", "X"),
                   c("O1", "O2", "O3"),
                   c("G", "G1", "G2", "G3", "G4a", "J"),
                   c("G", "G1", "G2", "G3", "G4b", "G5b", "H"),
                   c("R", "R1", "R2", "O"))

Но пути 3 и 4 перекрываются.

Как свернуть вершины, когда пути к контракту перекрываются?Мне нужно получить атрибут name и type из последней вершины в каждом пути, добавив значение inter.

Без перекрывающихся наборов вершин для сокращения, я могу сделать то же самое, как описано ниже.

tocontract <- tocontract[-4]


nid <- c(1L, 2L, 3L, 4L, 5L, 6L, 5L, 8L, 8L, 8L, 8L, 8L, 13L, 8L, 15L, 
         16L, 17L, 18L, 17L, 17L, 17L, 22L, 22L, 22L)

ig2 <- contract.vertices(ig, mapping = nid,
                         vertex.attr.comb = list(inter = "sum",
                                                 name = "last",
                                                 type = "last",
                                                 "first"))

ig2 <- simplify(delete.vertices(ig2, V(ig2)[ degree(ig2) == 0]))

enter image description here

...