2017-11-13 8 views
2

ich habe folgendes einfaches Beispiel für eine verschachtelte Liste:basierend auf Zustand in R

list(list(structure(list(group = "a", def = "control"), .Names = c("group", 
"def"))), list(structure(list(group = "b", def = "disease1"), .Names = c("group", 
"def")))) 

Die Struktur ist wie folgt:

str(t1) 
List of 2 
$ :List of 1 
..$ :List of 2 
.. ..$ group: chr "a" 
.. ..$ def : chr "control" 
$ :List of 1 
..$ :List of 2 
.. ..$ group: chr "b" 
.. ..$ def : chr "disease1" 

Gibt es eine einfache Möglichkeit, nur die verschachtelte Liste zu erhalten, die eine bestimmte Bedingung erfüllt. Wenn ich zum Beispiel nur den Namen der Gruppe, z. B. "a", wüsste, wie würde ich die entsprechende Unterliste erhalten? Im Beispiel wäre dies die erste verschachtelte Liste sein:

[[1]] 
[[1]]$group 
[1] "a" 

[[1]]$def 
[1] "control" 

So im Wesentlichen für mich suche einen Weg group == "a" in dieser verschachtelten Listenstruktur anzuwenden.

Antwort

3

Wir können eine Unterliste einer Liste mit lapply extrahieren. Wir können auch eine Funktion schreiben.

get_sublist <- function(group_name) { 
    lst[lapply(lst, function(x) x[[1]][[1]]) == group_name] 
} 


get_sublist("a") 
#[[1]] 
#[[1]][[1]] 
#[[1]][[1]]$group 
#[1] "a" 

#[[1]][[1]]$def 
#[1] "control" 

get_sublist("b") 
#[[1]] 
#[[1]][[1]] 
#[[1]][[1]]$group 
#[1] "b" 

#[[1]][[1]]$def 
#[1] "disease1" 
+0

Danke, das funktioniert ganz gut! – Oliver

1

Wir können tibble konvertieren und dann mit map einen logischen Vektor schaffen die 'lst' der Teilmenge

library(purrr) 
library(magrittr) 
library(tibble) 
lst %>% 
     map_lgl(., ~map_lgl(., ~as.tibble(.) %>% 
     .$group=='a')) %>% 
     extract(lst, .) %>% 
     .[[1]] 
#[[1]] 
#[[1]]$group 
#[1] "a" 

#[[1]]$def 
#[1] "control" 

Oder nutzen Sie die modify_depth

lst %>% 
    modify_depth(., 2, ~as.tibble(.)[['group']]=='a') %>% 
    unlist %>% 
    extract(lst, .) 

Hier gehen wir davon aus, dass die Position der 'Gruppe' kann sich in der list ändern.

0

Auf der Antworten bereits zur Verfügung gestellt, ich habe auch von der „purrr“ Bibliothek „halten“ mit den richtigen Ergebnissen schaffte es:

library(purrr) 
get_sublist <- function(group_name) { 
keep(l, function(x) x[[1]][[1]] == group_name) 
} 
get_sublist("b") 
Verwandte Themen