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