2009-07-23 16 views
10

Tengo un marco de datos que detalla los pesos de los bordes entre N nodos. ¿Hay algún paquete para trabajar con este tipo de datos?Manipulación de datos de red en R

Por ejemplo, me gustaría trazar la siguiente información como una red:

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 

Respuesta

14

Una opción es el paquete network, parte de la familia de statnet R paquetes de análisis de redes sociales estadística. Maneja los datos de la red de forma dispersa, lo cual es bueno para conjuntos de datos más grandes.

A continuación, hago lo siguiente:

  • carga la edgelist (las primeras dos columnas) en un objeto de red
  • asignar los recuentos a ser un atributo borde llamado peso.
  • traza la red con gplot. (Véase la página de ayuda para cambiar el espesor de los bordes.)
  • parcela un sociomatriz (sólo un conjunto de 5x5 de bloques que representan la matriz de adyacencia, donde el i, j) celular (es la sombra de la cuenta relativa)
 
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

¡Excelente respuesta! ¡Muy útil! – RHelp

4

Aquí es cómo hacer un diagrama de red de los datos en 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

también he estado trabajando en igraph. Una forma de crear un gráfico es escribir una lista de todos los nodos "de" "a" en un archivo de texto y volver a leerlo como un objeto de gráfico. El objeto gráfico puede estar sujeto a muchos procesos teóricos de gráficos y puede manejar redes bastante grandes.

0

En mi experiencia, igraph es mi paquete favorito para grandes trabajos de teoría de gráficos. Es eficiente desde el punto de vista de la memoria y tiene algunos algoritmos muy buenos. igraph usa una estructura de datos similar a edgelist interna.
Para cosas más simples/más pequeñas tiendo a usar el paquete 'sna' ("análisis de redes sociales"). Es ideal para el trabajo interactivo y el trazado de redes más pequeñas. sna usa más una estructura de datos de matriz de adyacencia.

+0

El paquete de red también tiene una implementación escasa. –