2012-11-16 3 views
6

Mam dwie macierze sąsiadujące dynamicznej sieci w plikach tekstowych, okres 1 i 2 w R (igraph). Chciałbym pokolorować wierzchołki i krawędzie, które są nowe w drugiej sieci na zielono.Jak mogę kolorować węzły i krawędzie z macierzy sąsiedztwa w r?

Na przykład pierwsza sieć mogłaby wyglądać następująco:

1 3 6 10 11 
1 NA NA NA NA NA 

3 NA NA NA NA NA 

6 NA NA NA 8.695652174 13.04347826 

10 NA NA 2.586206897 NA 3.448275862 

11 NA NA NA 2.919708029 NA 

i zmian następnie do tej drugiej sieci:

1 2 3 6 10 
1 NA NA NA NA NA 

2 NA NA NA NA NA 

3 NA NA NA NA NA 

6 NA NA NA 12.32091691 8.022922636 

10 NA NA 7.228915663 NA NA 

Kodeksu czytać w R:

t1 <- structure(matrix(c(NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,NA,8.695652174,13.04347826, 
         NA,NA,2.586206897,NA,3.448275862, 
         NA,NA,NA,2.919708029,NA),nrow=5, ncol=5, byrow=TRUE), 
       dimnames=list(c(1,3,6,10,11), c(1,3,6,10,11))) 

t2 <- structure(matrix(c(NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,NA,NA,NA, 
         NA,NA,12.32091691,8.022922636,NA, 
         NA,NA,7.228915663,NA,NA),nrow=5, ncol=5, byrow=TRUE), 
       dimnames=list(c(1,2,3,6,10), c(1,2,3,6,10))) 

t3 < - struktura (macierz (c (NA, NA, NA, NA, NA, NA, NA 7.2289, NA, NA, NA, 10.4798, NA, NA, NA, NA, NA, 8.1364, NA, 3.8762, NA, NA, NA, NA), nrów = 5, ncol = 5, byrow = TRUE), dimnames = lista (c (1,3,4,6,10), c (1,3,4,6,10)))

Jak mogę połączyć te sieci w R, więc że R wie, które wierzchołki są nowe?

+0

możesz zrobić to w pytaniu możemy wyciąć i wkleić do R do odtworzenia danych? Podpowiedź: użyj 'dput (thing)', aby utworzyć możliwą do wklejenia reprezentację [małego] obiektu ... – Spacedman

Odpowiedz

6

Idealnym rozwiązaniem byłoby zadzwonić pod numer graph.union, ale ma to pewne błędy w aktualnej wersji, więc tutaj jest rozwiązanie obejścia problemu.

Używasz NA do zaznaczania brakujących krawędzi, co jest nieco dziwne, ponieważ NA oznacza, że ​​nie wiesz, czy brakuje krawędzi, czy nie. Zamienię tylko NA s zerami.

t1[is.na(t1)] <- 0 
t2[is.na(t2)] <- 0 

g1 <- graph.adjacency(t1, weighted=TRUE) 
g2 <- graph.adjacency(t2, weighted=TRUE) 

## Vertices are easy 
V(g2)$color <- ifelse(V(g2)$name %in% V(g1)$name, "black", "darkgreen") 

## Edges are a bit trickier 
el1 <- apply(get.edgelist(g1), 1, paste, collapse="-") 
el2 <- apply(get.edgelist(g2), 1, paste, collapse="-") 
E(g2)$color <- ifelse(el2 %in% el1, "black", "green") 

plot(g2, vertex.label.color="white", vertex.label=V(g2)$name) 

enter image description here

+0

Dziękuję bardzo. Próbowałem tego i działa idealnie na krawędziach, ale wierzchołki pozostają niebieskie i nie stają się czarne lub zielone. Czy potrzebuję specjalnej paczki? Dzięki – user1829340

+0

@ user1829340: masz na myśli kopiowanie i wklejanie mojego kodu nie działa dla ciebie? To naprawdę dziwne. Jesteś pewien, że macierze danych mają nazwy kolumn i wierszy? –

+0

teraz działa, przepraszam, że zapomniałem dimnames. Teraz mam trzecią sieć (możesz zobaczyć powyższy kod). Jak mogę zrobić te krawędzie i wierzchołki na czerwono w sieci t2, które znikną w sieci t3? – user1829340

Powiązane problemy