In R, gewusst wie: filtern von Listen von Listen?
Laut Handbuch Filter arbeitet auf Vektoren, und es passiert auch auf Listen, zB.:
z <- list(a=1, b=2, c=3)
Filter(function(i){
z[[i]] > 1
}, z)
$b
[1] 2
$c
[1] 3
Jedoch, es funktioniert nicht, auf Listen von Listen, zB.:
z <- list(z1=list(a=1,b=2,c=3), z2=list(a=1,b=1,c=1), z3=list())
Filter(function(i){
if(length(z[[i]])>0){
if(z[[i]]$b > 1)
TRUE
else
FALSE
}
else
FALSE
}, z)
Error in z[[i]] : invalid subscript type 'list'
Was ist der beste Weg zum filtern von Listen von Listen ohne Verwendung von nested loops? Es könnte auch sein, Listen von Listen von Listen...
(Ich habe versucht, mit verschachtelten lapply statt, schafft es aber nicht, damit es funktioniert.)
Edit: im 2. Beispiel, hier ist, was ich will zu erhalten:
list(z1=list(a=1,b=2,c=3))
ist, ohne z$z2 da z$z2$b < 1, und ohne z$z3, weil es leer ist.
- Haben Sie versucht, die
rapply
? - ja, danke, aber ich weiß nicht verwalten, um erhalten die Ausgabe will ich (siehe mein edit)
- Das ist merkwürdig: jemand anderes gepostet hier eine Antwort und jetzt ist es Weg. Ich weiß nicht, was es gelöst, obwohl.
- Listen sind Vektoren, nicht nur Atomare Vektoren
- Das war ich. Lesen Sie die Frage zu schnell; OP will jede Komponente Liste als eine Einheit betrachtet und zurückgegeben oder nicht, nach einigen Zustand.
rapply
(Glaube ich) Bohrungen senkrecht nach unten, um jedes einzelne element jedes verschachtelte Liste. - Ich bin nicht vertraut mit dieser Funktion, aber ein Vektor kann ein index für eine Tabelle (matrix) oder eine Liste von Vektoren, die wiederum die Indizes für die Liste-Objekt. Mit verschachtelten Listen ist keine große Sache. Verwende ich Häufig ein index-lookup zu finden, um Tabellen von Parametern oder komplexeren Indizes. Wenn die Breite der Tabelle festlegen, in die tiefsten Länge der Verschachtelung, dann alle weniger flach Einträge können trivial Indizes von 1 in der Tabelle.
InformationsquelleAutor tflutre | 2011-08-01
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie sollten:
Prädikat (die Funktion, die Sie verwenden, um zu filtern, z) gilt für die Elemente von z, die nicht Ihren Indizes.
Hatte ich nie benutzt
Filter
vor Ihrer Frage, so war dies eine gute übung für die erste Sache am morgen 🙂Gibt es zumindest ein paar Dinge, die stolpern, die Sie bis (glaube ich).
Beginnen wir mit deiner ersten einfachen anonymen Funktion, aber lass Sie alleine stehen, so ist es einfacher zu Lesen ist:
Sollte es springen heraus Sie, dass diese Funktion nimmt ein argument,
i
, noch in der Funktion ruft esz
. Das ist nicht sehr gut "funktionaler" Programmierung 🙂So beginnen zu ändern, dass-Funktion:
Und du wirst sehen
Filter
tatsächlich laufen gegen eine Liste von Listen:aber es gibt:
das nicht genau das, was Sie wollen. Ehrlich gesagt kann ich nicht verstehen, warum es gibt, das Ergebnis, vielleicht kann jemand es mir erklären.
@DWin war die bellen, bis Sie den richtigen Baum, wenn er sagte, dass es eine rekursive Lösung. Ich hackte eine erste Stich an einer rekursiven Funktion, aber Sie brauchen, um ihn zu verbessern:
fancyFilter
schaut auf das erste element desx
übergeben, und wenn es das element ist eine Liste, es ruft rekursivfancyFilter
auf jedes element der Liste. Was aber, wenn das element #2 ist nicht eine Liste? Das ist die Art von Sache, die Sie sollten Sie testen und herauszufinden, ob es Fragen für Sie. Aber das ErgebnisfancyFilter
scheint Aussehen, was Sie nach sind:Möchten Sie vielleicht fügen Sie einige Logik zum bereinigen der Ausgabe, so dass die
FALSE
Ergebnisse nicht bekommen, belästigt innumeric(0)
. Und, natürlich, ich habe ein Beispiel, die nur die einfache Funktion, nicht die komplexere Funktion, die Sie verwendet, im zweiten Beispiel.Keine Ansprüche für die Schönheit hier und es ist nicht eine Tiefe Suche:
EDIT: Dieser code wird Durchlaufen einer Liste und montieren Sie den Knoten " b " > 1. Es braucht etwas Arbeit, um ordentlich beschriften Sie die Knoten. Zunächst eine Liste mit tiefer Verschachtelung:
Filter sub-Liste von Schlüssel.
Geschrieben in der Lektüre der Antworten, die helfen mir.