Création d'une liste de contiguïté d'un data.frame
Question
I ai un data.frame avec 2 colonnes: Noeud A, Noeud B. Chaque entrée dans la trame implique un avantage dans un graphe entre le noeud A et B.
Il doit y avoir une belle uniligne pour convertir cette data.frame dans une liste de contiguïté. Tous les conseils?
La solution
rapide et sale ...
> 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
Autres conseils
Depuis que vous avez taguée cette igraph , que diriez-vous en utilisant une fonctionnalité intégrée?
> g <- graph.data.frame( edges )
> adjlist <- get.adjedgelist(g)
mise en garde est seulement les sommets sont indexés à zéro, ce qui va changer avec igraph 0,6.
> 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
comment vous représenter même une liste de contiguïté en R? il a besoin des listes de taille variable pour l'ensemble des noeuds adjacents; alors vous devez utiliser une liste (); mais à quoi bon est-il avoir dans R?
Je peux penser à des tours boiteux avec des fonctions comme sapply mais ils font un balayage linéaire pour chaque nœud. mais en jouant autour pendant 1 minute, voici: une liste de pairlists, où le deuxième élément de chaque paire est la liste de contiguïté. sortie est plus fou que le datstructure est vraiment.
> 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()