2012-10-21 9 views
12

Pracuję z igraph dla R. Mój wykres jest oparty na edgelist, który zawiera równoległe krawędzie (więcej niż jeden brzeg z tego samego źródła i celu). Chciałbym przekonwertować te równoległe krawędzie do wagi atrybutu krawędzi. Czy istnieje sposób, aby to zrobić?R igraph przekonwertować równoległe krawędzie do atrybutu wagi

Jeśli nie ma łatwego sposobu. jak mogę zidentyfikować te równoległe krawędzie?

duplicated(E(net)) 

nie zwraca pojedynczego duplikatu. Przypuszczam, że szuka duplikatów identyfikacyjnych.

Odpowiedz

21

Można również wykorzystać E(graph)$weight <- 1 następnie simplify(graph, edge.attr.comb=list(weight="sum")), aby przypisać wagę 1 do każdej krawędzi, a następnie zwijanie wielu krawędzi w pojedyncze podczas sumowania wag.

+2

To rozwiązanie jest o wiele lepsze, ponieważ wykorzystuje liniową przestrzeń i czas, podczas gdy rozwiązanie macierzy sąsiedztwa wykorzystuje kwadratową (pod względem liczby wierzchołków) przestrzeń i czas. –

+1

Btw. to również eliminuje krawędzie pętli, więc jeśli tego nie chcesz, użyj argumentu 'remove.loops = FALSE', aby" uprościć() ". –

4

Wydaje eksportowania nieważoną wykres z równoległych krawędzi do macierz sąsiedztwa w igraph tworzy listę ciężarów z liczbą krawędzi jak ciężar, który może być następnie ponownie przeczytać:

library("igraph") 
E <- matrix(c(1,1,1,2,2,2),3,2) 
G <- graph.edgelist(E) 

G2 <- graph.adjacency(get.adjacency(G),weighted=TRUE) 
+0

Jest to bardzo pomocne rozwiązanie dla bardzo dużych grafów . – timothyjgraham

0

W przypadku, gdy chcesz uzyskać liczbę równoległych krawędziach grafu bez dodawania atrybutu wagi do wykresu, można użyć następujących funkcji:

duplicated <- function(graph){ 
    g_local <- graph 
    E(g_local)$weight <- 1 
    g_simp <- simplify(g_local, edge.attr.comb=list(weight="sum")) 
    w <- E(g_simp)$weight 
    return(sum(w-1)) 
} 
Powiązane problemy