2012-11-16 4 views
6

Tôi có hai ma trận kề nhau của một mạng động trong các tệp văn bản, khoảng thời gian 1 và 2 trong R (igraph). Tôi muốn tô màu các đỉnh và các cạnh mới trong mạng thứ hai màu xanh lục.Làm cách nào để tô màu các nút và cạnh của ma trận kề trong r?

Ví dụ mạng đầu tiên có thể nhìn như thế này:

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 

và những thay đổi sau đó vào mạng thứ hai này:

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 

Mã này để đọc trong 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 < - cấu trúc (ma trận (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, NA), nrow = 5, ncol = 5, byrow = TRUE), dimnames = list (c (1,3,4,6,10), c (1,3,4,6,10)))

Làm cách nào để liên kết các mạng đó trong R, vì vậy R biết đỉnh nào là mới?

+0

Bạn có thể làm điều này vào một câu hỏi chúng ta có thể cắt và dán vào R để tái tạo dữ liệu của bạn? Gợi ý: sử dụng 'dput (điều)' để tạo ra một biểu diễn có thể dán được của một đối tượng [nhỏ] ... – Spacedman

Trả lời

6

Lý tưởng nhất là giải pháp là gọi graph.union, nhưng có một số lỗi trong phiên bản hiện tại, do đó, đây là giải pháp khắc phục sự cố.

Bạn đang sử dụng NA để đánh dấu các cạnh bị thiếu, có một chút lạ, vì NA có nghĩa là bạn không biết liệu cạnh đó có bị thiếu hay không. Tôi sẽ chỉ thay thế các số NA bằng số không.

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

Cảm ơn bạn rất nhiều. Tôi đã thử điều này và nó hoạt động hoàn hảo cho các cạnh, nhưng các đỉnh vẫn còn màu xanh, và không nhận được màu đen hoặc màu xanh lá cây. Tôi có cần gói đặc biệt không? Cảm ơn – user1829340

+0

@ user1829340: bạn có nghĩa là sao chép và dán mã của tôi không hoạt động cho bạn? Điều đó thật kỳ lạ. Bạn có chắc ma trận dữ liệu của mình có tên cột và hàng không? –

+0

bây giờ nó hoạt động, tôi xin lỗi tôi quên các dimnames. Bây giờ tôi có một mạng thứ ba (bạn có thể thấy mã ở trên). Làm thế nào tôi có thể làm cho các cạnh và đỉnh đỏ trong mạng t2, mà sẽ biến mất trong mạng t3? – user1829340