Преобразование ориентированного графа в неориентированный граф и добавление весов

У меня есть ориентированный граф, в котором агенты перемещаются с node1 на node2, как показано ниже.

node1 node2 flow
A B 12
B A 6
C A 1
D B 3
E A 4
A E 10
E B 1
B E 2

Я хотел бы изменить этот ориентированный граф на неориентированный, суммируя поток между ребрами, отображая результат, такой как

node1 node2 flow
A B 18
C A 1
D B 3
A E 14
B E 3

Я пытался создать индивидуальную базу идентификаторов по краям, но безуспешно.

Любые мысли о том, как это сделать?


person Felipe Alvarenga    schedule 27.06.2017    source источник


Ответы (1)


Вы можете использовать функцию igraph as.undirected с аргументом edge.attr.comb, установленным на sum. Сначала создайте ориентированный граф:

library(igraph)

weighted_edgelist <- data.frame(
  node1 = c("A", "B", "C", "D", "E", "A", "E", "B"),
  node2 = c("B", "A", "A", "B", "A", "E", "B", "E"),
  flow  = c(12, 6, 1, 3, 4, 10, 1, 2) 
)

directed_graph <- graph.data.frame(weighted_edgelist, directed = TRUE)

А затем сверните направленные ребра в ненаправленные ребра, суммируя веса ребер (в вашем случае поток):

undirected_graph <- as.undirected(directed_graph,
                                  mode = "collapse", edge.attr.comb = "sum")

Результат:

res <- data.frame(get.edgelist(undirected_graph),
                  get.edge.attribute(undirected_graph, "flow"))
colnames(res) <- c("node1", "node2", "flow")
res

  node1 node2 flow
1     A     B   18
2     A     C    1
3     B     D    3
4     A     E   14
5     B     E    3
person George Wood    schedule 28.06.2017