2009-07-11 13 views

Respuesta

6

rápida y sucia ...

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> adjlist <- by(edges, edges$nodea, function(x) x$nodeb) 

> for (i in as.character(unique(edges$nodea))) { 
+ cat(i, ' -> ', adjlist[[i]], '\n') 
+ } 

1 -> 1 5 
2 -> 2 4 
4 -> 3 

> adjlist 
edges$nodea: 1 
[1] 1 5 
------------------------------------------------------------ 
edges$nodea: 2 
[1] 2 4 
------------------------------------------------------------ 
edges$nodea: 4 
[1] 3 
+0

Guh. Sí. Ese es un delineador perfecto. Por extraño que parezca, mi solución for loop se ejecuta dos veces más rápido que por(). –

+0

de hecho no es muy rápido cuando su tabla tiene 50,000 de largo (con ~ 5000 identificadores). ¿Hay alternativas más rápidas? –

0

¿cómo podría incluso representar una lista de adyacencia en R? necesita listas de tamaño variable para el conjunto de nodos adyacentes; entonces debes usar una lista(); pero, ¿de qué sirve tenerlo en R?

puedo pensar en trucos incoherentes con funciones similares pero hacen un escaneo lineal para cada nodo. pero jugando durante 1 minuto, aquí está: una lista de emparejamientos, donde el segundo elemento de cada par es la lista de adyacencia. la salida es más loca de lo que realmente es la estructura dats.

> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4)) 
> library(plyr) 
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a]))) 
[[1]] 
[[1]]$node 
[1] 1 

[[1]]$adjacents 
[[1]]$adjacents[[1]] 
[1] 1 

[[1]]$adjacents[[2]] 
[1] 2 



[[2]] 
[[2]]$node 
[1] 2 

[[2]]$adjacents 
[[2]]$adjacents[[1]] 
[1] 2 

[[2]]$adjacents[[2]] 
[1] 3 

[[2]]$adjacents[[3]] 
[1] 4 



[[3]] 
[[3]]$node 
[1] 3 

[[3]]$adjacents 
list() 


[[4]] 
[[4]]$node 
[1] 4 

[[4]]$adjacents 
list() 
+0

Brendan: el punto de vista estándar (al menos desde el igrafo) es una lista de vértices, y cada elemento de lista es un vector de vértices adyacentes. –

4
> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5)) 

> attach(edges) 

> tapply(nodeb,nodea,unique) 

$`1` 
[1] 1 5 

$`2` 
[1] 2 4 

$`4` 
[1] 3 
+0

por alguna extraña razón interna a R 'tapply (as.character (nodeb), as.character (nodea), unique)' es 100 veces más rápido al convertir mi tabla muy larga (100,000 líneas) a una lista que '' tapply (nodeb, nodea, único) '!!! –

11

Ya que este etiquetados , ¿Y si uso construido en la funcionalidad?

> g <- graph.data.frame(edges) 
> adjlist <- get.adjedgelist(g) 

La única advertencia es que los vértices están sin índice, que cambiarán con igraph 0.6.

Cuestiones relacionadas