2009-07-23 11 views
10

Ho un frame di dati che riporta i pesi del bordo tra N nodi. Esiste un pacchetto per lavorare con questo tipo di dati?Manipolazione dei dati di rete in R

Per esempio, vorrei tracciare le seguenti informazioni come una rete:

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 

risposta

14

Una possibilità è il pacchetto network, parte della famiglia di statnet pacchetti R per l'analisi statistica social network. Gestisce i dati di rete in modo spartano, il che è utile per i set di dati più grandi.

Qui di seguito, effettuare le seguenti operazioni:

  • carico del edgelist (prime due colonne) in un oggetto rete
  • assegnare i conteggi di essere un attributo bordo chiamato peso.
  • trama la rete con gplot. (Vedere la pagina di aiuto per cambiare lo spessore dei bordi.)
  • trama una sociomatrix (solo un insieme 5x5 di blocchi che rappresentano la matrice di adiacenza, dove la cella (i, j) è ombreggiata dal conteggio relativo)
 
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

Ottima risposta! Molto utile! – RHelp

4

Ecco come fare una trama di rete dei dati in 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

ho anche lavorato in IGRAPH. Un modo per creare un grafico è scrivere un elenco di tutti i "da" "a" nodi in un file di testo e leggerlo di nuovo come oggetto grafico. L'oggetto grafico può essere sottoposto a molti processi teorici grafici e può gestire reti piuttosto grandi.

0

In base alla mia esperienza, igraph è il mio pacchetto preferito per un lavoro di grandi dimensioni, basato sulla teoria dei grafi. È efficiente in termini di memoria e ha alcuni algoritmi molto buoni. igraph usa una struttura di dati interna simile a un edgelist.
Per cose più semplici/più piccole, tendo a utilizzare il pacchetto "sna" ("analisi dei social network"). È ottimo per il lavoro interattivo e la realizzazione di reti più piccole. sna usa più di una struttura dati adiacente ad una matrice.

+0

Anche il pacchetto di rete ha un'implementazione sparsa. –