2009-07-23 44 views
10

Tôi có khung dữ liệu chi tiết các trọng số cạnh giữa các nút N. Có một gói để làm việc với loại dữ liệu này không?Thao tác dữ liệu mạng trong R

Ví dụ, tôi muốn vẽ các thông tin sau như một mạng lưới:

p1 p2 counts 
1 a b 100 
2 a c 200 
3 a d 100 
4 b c  80 
5 b d  90 
6 b e 100 
7 c d 100 
8 c e  40 
9 d e  60 

Trả lời

14

Một lựa chọn là network gói, một phần của gia đình statnet các gói R để phân tích mạng xã hội thống kê. Nó xử lý dữ liệu mạng một cách thưa thớt, rất tốt cho các tập dữ liệu lớn hơn.

Dưới đây, tôi làm như sau:

  • tải các edgelist (hai cột đầu tiên) vào một đối tượng mạng
  • giao đếm là một thuộc tính cạnh gọi là trọng lượng.
  • vẽ đồ thị mạng bằng gplot. (Xem trang trợ giúp để thay đổi độ dày của các cạnh.)
  • vẽ một sociomatrix (chỉ là một khối 5x5 đại diện cho ma trận kề, trong đó ô (i, j) được tô bóng theo số tương đối)
 
A = read.table(file="so.txt",header=T) 
A 
     p1 p2 counts 
    1 a b 100 
    2 a c 200 
    3 a d 100 
    4 b c  80 
    5 b d  90 
    6 b e 100 
    7 c d 100 
    8 c e  40 
    9 d e  60 

library(network) 
net = network(A[,1:2]) 
# Get summary information about your network 
net 
    Network attributes: 
     vertices = 5 
     directed = TRUE 
     hyper = FALSE 
     loops = FALSE 
     multiple = FALSE 
     bipartite = FALSE 
     total edges= 9 
     missing edges= 0 
     non-missing edges= 9 
     Vertex attribute names: 
     vertex.names 
    adjacency matrix: 
     a b c d e 
    a 0 1 1 1 0 
    b 0 0 1 1 1 
    c 0 0 0 1 1 
    d 0 0 0 0 1 
    e 0 0 0 0 0 

set.edge.attribute(net,"weight",A[,3]) 
gplot(net) 

## Another cool feature 
s = as.sociomatrix(net,attrname="weight") 
plot.sociomatrix(s) 
+0

Câu trả lời hay! Rất hữu ích! – RHelp

4

Dưới đây là cách thực hiện một âm mưu mạng của dữ liệu trong igraph:

d <- data.frame(p1=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'), 
       p2=c('b', 'c', 'd', 'c', 'd', 'e', 'd', 'e', 'e'), 
       counts=c(100, 200, 100,80, 90,100, 100,40,60)) 

library(igraph) 
g <- graph.data.frame(d, directed=TRUE) 
print(g, e=TRUE, v=TRUE) 
tkplot(g, vertex.label=V(g)$name) 
0

tôi cũng được làm việc trong igraph. Một cách để tạo biểu đồ là viết ra một danh sách tất cả từ "từ" "đến" các nút vào một tệp văn bản đã đọc lại nó dưới dạng đối tượng biểu đồ. Đối tượng đồ thị có thể phải chịu nhiều quy trình lý thuyết đồ thị và có thể xử lý các mạng khá lớn.

0

Theo kinh nghiệm của tôi, igraph là gói yêu thích của tôi cho công việc lý thuyết đồ thị lớn. Đó là bộ nhớ hiệu quả và có một số thuật toán rất tốt. igraph sử dụng cấu trúc dữ liệu giống như edgelist nội bộ.
Đối với những điều đơn giản/nhỏ hơn, tôi có xu hướng sử dụng gói 'sna' ("phân tích mạng xã hội"). Thật tuyệt vời cho công việc tương tác và âm mưu của các mạng nhỏ hơn. sna sử dụng nhiều cấu trúc dữ liệu ma trận kề.

+0

Gói mạng cũng có triển khai thưa thớt. –

Các vấn đề liên quan