2017-05-17 8 views
0

Ich versuche, basierend auf einem Variablenwert zu filtern, und habe mehrere Kombinationen von Filter_, Punkten und Anführungszeichen vergeblich ausprobiert.R dplyr Auflösungsvariable im Bedingungsfilter

Als Beispiel habe ich eine

runlist = c(1, 2, 3, 4, 5) 

und ein Datenrahmen boo

run <- rep(seq(5), 3) 
edge1 <- sample(20, 15) 
edge2 <- sample(20, 15) 
weights <- sample(50, 15) 
boo <- as.data.frame(cbind(run, edge1, edge2, weights)) 

und ich möchte ein Datenrahmen namens Boo filtern, die iterativ so etwas wie aussehen als

for (i in runlist) { 
    bop <- boo %>% filter(run == i) 
    str(boo) 
} 

Ich vermute, ich werde hören, nicht für For-Schleifen und R, sondern uns e group_by(run), aber ich diese Daten zu igraph Senden und muß weiter den Datensatz der Teilmenge Dichte gerade Kanten und Gewichte, so dass der Gruppenvariable zu verlieren, wie in

bop <- boo %>% filter(run == i) %>% select(edge1, edge2, weights) 

ich will ein Netzwerkgraphen erstellen und finden und Zentralitätswerte für jeden Lauf.

bing <- graph.data.frame(bop) 

Wie erhalte ich die i in dem bedingten Filter als den richtigen Index zu lösen?

+0

Verwendung 'for (i in einzigartiger (boo $ run))' statt – Nate

+0

@Nate Tag Wow, ja, das funktioniert. Können Sie mir erklären, warum Ihr Vorschlag funktioniert, während 'runlist = unique (boo $ run)' und Indexierung auf 'runlist' nicht funktioniert? Und wie mache ich richtig @ Ihren Griff der ein Leerzeichen hat? – zazizoma

Antwort

2

Meine Antwort ist nicht zum "Auflösen einer Variablen in einem bedingten Filter", aber es gibt eine viel einfachere Möglichkeit zu tun, was Sie tun möchten.

Die große Idee ist es, den Datenrahmen basierend auf der Variablen run aufzuteilen und eine Funktion auf jedes dieser Teile abzubilden. Diese Funktion nimmt ein Stück des Datenrahmens und spuckt ein Bild aus.

Der folgende Code führt das oben genannte aus und speichert eine Liste von Diagrammen in der Spalte . (Es ist eine Liste-Spalte, sehen Sie mehr auf der R for data science book)

boo %>% 
    group_by(run) %>% 
    nest() %>% 
    mutate(graph = map(data, function(x) graph.data.frame(x %>% select(edge1, edge2, weights)))) %>% 
    mutate(density = map(graph, function(x) graph.density(x)) 
+0

intrigierend. . . Ich werde es ausprobieren und sehen, ob ich die Zentralitäts- und Dichtewerte, die ich will, bekommen kann. Mir gefällt, dass Sie die Auswahl in den Graphenaufruf eingefügt haben. – zazizoma

+0

Also habe ich die Liste-Spalte von Grafiken, aber ich war nicht erfolgreich bei der Verwendung der Grafiken einzeln, um Dichten und Zentralitäten Statistiken zu erhalten. Ich habe sogar Ihren Vorschlag gespiegelt und versucht 'PDensities <- PGraphs %>% muate' (PDensity = map (data, function (x) graph.density (x))) '' erhalten aber keine graph object error messages. Danke auch für das Senden des Dokuments Link, sehr interessant, aber es empfiehlt Besen, die nicht scheint, Netzwerkgrafiken zu säubern. Wie würde ich beispielsweise graph.dichte für jedes Diagramm erhalten? Ich würde gerne diese Methode verwenden. – zazizoma

+0

Jeder Graph wird als Zelle im Datenrahmen gespeichert. Sie können den Graphen in der 2. Zeile und der 3. Spalte mit 'my_dataframe [2, 3] einfach wie gewohnt extrahieren. Es gibt wahrscheinlich eine effizientere Zuordnungsoperation, die jeder Zelle der Listenspalte eine Extraktfunktion zuordnet. Aber die grundlegende Idee ist, dass Sie Dinge aus der Listenspalte genauso wie jede Spalte extrahieren können. – Heisenberg