2016-07-29 18 views
0

Ich habe hier einen guten Ratschlag bekommen, wie man Nachbarn nach einer Liste von Netzwerkknoten sucht. Siehe: lapply function to look up neighbors in igraph (when not all nodes are found)Generiere eine Liste von Nachbarn zweiten Grades mit Hilfe von lapply und igraph

Jetzt muss ich das gleiche mit Nachbarn zweiten Grades tun. Das Ersetzen dieser Schleife durch ego oder neighborhood führt jedoch zu einem Fehler.

edgelist <- read.table(text = " 
A B 
B C 
C D 
D E 
C F 
F G") 

testlist <- read.table(text = " 
A 
H 
C 
D 
J") 

testlist2 <- read.table(text = " 
A 
C 
B 
D 
E") 

library(igraph) 
graph <- graph.data.frame(edgelist) 
str(graph) 

get_neighbors <- function(graph, n) { 

    do.call(rbind, lapply(n, function(x) { 

    if (x %in% V(graph)$name) { 

     nb <- neighborhood(graph,2, x) ##HERE## 

     if (length(nb) > 0) { 
     data.frame(lookupnode=x, 
        neighbor=nb$name, # h/t @MrFlick for this shortcut 
        stringsAsFactors=FALSE) 
     } else { 
     data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE) 
     } 

    } else { 
     data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE) 
    } 

    })) 

} 

A=get_neighbors(graph, as.character(testlist$V1)) 

Fehler bei data.frame (lookupnode = x, Nachbar = nb $ name, stringsAsFactors = false): Argumente implizieren unterschiedliche Anzahl der Zeilen: 1, 0

entnehme ich, das Problem ist, dass Ego und Nachbarschaft kann nicht direkt in einen Datenrahmen gezwungen werden. Ich kann unlist verwenden und dann einen Datenrahmen einfügen, aber die Werte, die ich will, enden als row.names nicht Werte, die ich in meine Ausgabe setzen kann.

Wie kann ich eine Ausgabe von Nachbarn zweiten Grades erstellen?

Antwort

1

Changed
neighbor=nb$name, # h/t @MrFlick for this shortcut 

zu

neighbor=names(unlist(nb)), # h/t @MrFlick for this shortcut 

und es ist für mich jetzt arbeiten.

> A 
    lookupnode neighbor 
1   A  A 
2   A  B 
3   A  C 
4   H  <NA> 
5   C  C 
6   C  B 
7   C  D 
8   C  F 
9   C  A 
10   C  E 
11   C  G 
12   D  D 
13   D  C 
14   D  E 
15   D  B 
16   D  F 
17   J  <NA> 
> 
+0

Funktioniert wie ein Charme. Ich musste 'Namen' hinzufügen, um die' row.names' zu ziehen. – Danielle