2017-09-25 1 views
1

J'ai créé une table avec igraph liste des données comme suit:Comment créer la table à la fois des informations en avant et en arrière pour les bords avec igraph

enter image description here

a, b, c, d, e sont les bords. a et b sont des arêtes mutuelles, avec les valeurs de pondération de 1 pour a-> b, 2 pour b-> a (il n'y a pas de boucle automatique).


Par la façon dont j'utiliser le code suivant pour créer le tableau ci-dessus:

library(igraph) 
library(dplyr) 

g <- data.frame(from = c("a", "b", "c", "d", "e"), 
       to = c("b", "a", "a", "b", "a"), weight = c(1:5)) %>% 
    igraph::graph_from_data_frame() 

Maintenant, j'espère créer un autre tableau répertoriant aussi bien les informations avant et en arrière entre les bords, comme ainsi que les valeurs de poids comme:

enter image description here

Est-ce que quelqu'un sait comment faire cela avec igraph?

+3

S'il vous plaît ne pas partager des données sous forme d'images. Les gens ne peuvent pas copier cela dans leur session R. – Axeman

+1

Comment déterminez-vous les lignes à conserver? Pourquoi avez-vous choisi "de c à a" et non "de a à c". Ne voulez-vous pas nécessairement une solution unique? – MrFlick

Répondre

1

D'abord, vous pouvez obtenir une liste des paires de noeuds qui partagent et bord quelle que soit la direction

simplified <- as.undirected(g, mode="collapse") 
pairs <- ends(simplified, E(simplified)) 

On peut alors écrire une fonction d'aide pour retourner un poids de bord donné entre deux nœuds et si elle n » t existe, le retour à la place NA

get_edge_weight<- Vectorize(function(a, b) { 
    e <- E(g)[a %->% b] 
    if(length(e)==1) { 
    e$weight 
    } else { 
    NA 
    } 
}) 

Ensuite, vous pouvez construire votre data.frame désiré avec

data.frame(from=pairs[,1], to=pairs[,2], 
    fwd=get_edge_weight(pairs[,1], pairs[,2]), 
    back=get_edge_weight(pairs[,2], pairs[,1]) 
) 
# from to fwd back 
# b a b 1 2 
# c a c NA 3 
# d b d NA 4 
# e a e NA 5 
+0

Cela a été très utile, merci beaucoup! – tttokio