2017-06-27 7 views
1

j'ai un graphe orienté où les agents se déplacent de nœud1 à NODE2 comme ce qui suitTransformer graphe orienté en un graphe non orienté et en ajoutant les poids en r

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 

Je souhaite changer ce graphe orienté dans une une non orienté , additionnant les flux entre les bords, ce qui rend un tel résultat

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

J'ai essayé de créer la base de ids individuels sur les bords, mais sans succès.

Des idées sur la façon de le faire?

Répondre

2

Vous pouvez utiliser la fonction igraphas.undirected avec l'argument edge.attr.comb défini sur sum. Tout d'abord générer votre graphique dirigé:

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) 

Et puis réduisez les bords dirigés vers les bords non orientés, en additionnant les poids de bord (dans votre cas, le débit):

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

Le résultat:

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