2009-07-11 7 views

risposta

6

rapido e sporco ...

> 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ì. Questo è un perfetto rivestimento. Stranamente, la mia soluzione for loop viene eseguita due volte più velocemente di(). –

+0

infatti non è molto veloce quando la tua tabella è lunga 50.000 (con ~ 5000 identificatori). Ci sono alternative più veloci? –

0

come rappresenterebbe una lista di adiacenza in R? ha bisogno di elenchi di dimensioni variabili per l'insieme di nodi adiacenti; quindi allora devi usare una lista(); ma allora a cosa serve averlo in R?

Posso pensare a trucchi lame con funzioni simil-ma, ma eseguono una scansione lineare per ogni nodo. ma giocando per 1 minuto, ecco: una lista di pairlist, dove il secondo elemento di ogni coppia è la lista di adiacenza. l'output è più folle di quanto lo sia la struttura dati.

> 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- il punto di vista standard (almeno da igraph's) è un elenco di vertici - e ogni elemento di elenco è un vettore di vertici adiacenti. –

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

per qualche strana ragione interna a R 'tapply (as.character (nodeb), as.character (nodea), unique)' è 100s di volte più veloce nel convertire la mia tabella molto lunga (100.000 linee) in una lista rispetto a 'tapply (Nodo B, NodoA, unico nel suo genere) '!!! –

11

Dal momento che si tagged questo , ne dite di usare costruito in funzione?

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

Solo l'avvertenza è che i vertici sono indicizzati a zero, che cambieranno con igraph 0.6.