2017-03-08 1 views
0

J'ai un problème similaire à celui-ci: Reading adjacency lists with isolated nodes using igraphcréer igraph avec des noeuds isolés

Je veux tracer les noeuds où certains ont aucune relation. Mais pour une raison quelconque la solution mentionnée dans le fil ne fonctionne pas au-dessus

mes données

data <- data.frame(ID = c(143918,176206,210749,219170,247818,314764,321459,335945,339637,700689,712607,712946,735907,735907,735907,735907,735907,735907,735908,735908,735908,735908,735908,735908,735910,735911,735912,735913,746929,746929,747540,755003,767168,775558,776656,794173,794175,807493), relation = c(111098,210749,176206,NA,NA,NA,NA,NA,NA,807493,NA,NA,735908,735910,735911,735912,735913,767168,735907,735910,735911,735912,735913,767168,NA,NA,NA,NA,NA,100723,NA,NA,NA,776656,775558,NA,NA,700689)) 

Cela devrait se traduire par une intrigue qui montre aussi des nœuds isolés:

v<-unique(data[,1]) 
e <- na.omit(data) 

g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

Pour une raison quelconque, je obtenir l'erreur: "Certains noms de vertex dans la liste des arêtes ne sont pas listés dans le cadre de données vertex".

J'espère que quelqu'un peut me dire ce que je fais mal et comment résoudre ce problème. Merci

EDIT: paqmo répond à ma question, merci!

Cependant, ma tâche nécessite une approche différente. Les ID qui sont dans les relations, mais qui sont manquants dans la première ligne, sont des personnes dans un emplacement différent. Ceux-ci devraient être omis, tout en maintenant chaque personne isolée de la première rangée. Ma solution pour cela utilise data.table pour l'instant:

v <- unique(c(data[,1])) 
v <- as.data.frame(v) 
e <- data 
setDT(v);setDT(e) 
setkey(v) 
setkey(e, relation) 
e <- e[v] 
e <- na.omit(e) 
g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

tout conseil pour une solution meilleure/plus efficace serait la bienvenue.

Répondre

1

Vous devez définir votre liste de sommets en fonction de les deux colonnes de votre objet data. Certains sommets sont dans la colonne 1, certains dans la colonne 2. Il vous manque ceux de la colonne 2.

Vous pouvez vérifier avec %in%:

> c(e[,1], e[,2]) %in% v 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[19] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[37] FALSE TRUE TRUE TRUE 

Comme vous pouvez le voir, il y a 2 éléments de e que ne sont pas dans v. Ainsi, vous obtenez le message d'erreur qui en dit autant.

Créez la liste de sommets v en prenant les valeurs uniques des deux colonnes dans data, moins les NA.

data <- data.frame(ID = c(143918,176206,210749,219170, 
          247818,314764,321459,335945, 
          339637,700689,712607,712946, 
          735907,735907,735907,735907, 
          735907,735907,735908,735908, 
          735908,735908,735908,735908, 
          735910,735911,735912,735913, 
          746929,746929,747540,755003, 
          767168,775558,776656,794173, 
          794175,807493), 
        relation = c(111098,210749,176206, 
           NA,NA,NA,NA,NA,NA,807493, 
           NA,NA,735908,735910,735911, 
           735912,735913,767168,735907, 
           735910,735911,735912,735913, 
           767168,NA,NA,NA,NA,NA,100723, 
           NA,NA,NA,776656,775558,NA,NA,700689)) 

v <- unique(c(data[,1], data[,2])) #Define v from both columns in data 
v <- na.omit(v) 
e <- na.omit(data) 

g<-graph.data.frame(e, vertices = v, directed = T) 
plot(g) 

enter image description here

+0

J'essaie d'éviter de poser une autre question à ce sujet, donc: Comment votre code suivant pour être appliqué 2 data.frames (un edgelist et Nodelist stockées séparément des données qui doivent être associées à 'graph.data.frame'):' v <- unique (c (données [, 1], données [, 2])) #Définir v des deux colonnes dans les données v <- na.omit (v) e <- na.omit (données) '? –

2

Il semble que vous essayez de fournir deux fois le nom de vertex, c'est-à-dire une fois pour la première colonne dans e, puis à nouveau comme argument, vertices = v.

Peut-être ce que vous cherchez vraiment est juste

g <- graph.data.frame(e, directed = T) 
plot(g) 

enter image description here