У меня есть 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)
Мне нужно заключить следующие пути.
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]))