2015-05-26 9 views
5

Szukałem SO, ale nie mogłem znaleźć trafnej odpowiedzi.Lista list wyszukiwania i podzbiorów list

Dane

Próbka:

example.list <- list(list("a",list("b"),list("c")),list("c")) 

Chciałbym listę zawierającą litery "C" podzbioru:

tu dostaje ostatni węzeł indeks, który zawiera litery "C":

check.a <- lapply(example.list, function(x) grep("c",x)) 

Jak mam uzyskać listę z powyższym indeksem? Lub w jaki sposób uzyskać listę?

Częścią uzyskania ostatnich węzłów z listy c (1,3) są poprzedzające węzły listy c (1,2).

EDIT: Pożądany wyjściowy: (coś takiego)

[[1]][[3]] 
[[1]][[3]][[1]] 
[1] "c" 


[[2]] 
[[2]][[1]] 
[1] "c" 

Jednak to, co potrzebne jest również, aby zrozumieć, z tym warunkiem indeksowania, jak mogę uzyskać podzbiór zagnieżdżonej listy? Użyj check.a.

EDIT 2:

Więc oto indeksy list, które mogą być wykorzystane do podzbioru właściwego wykazu węzły:

first.list.index <- which(lapply(lapply(example.list, function(x) grep("c",x)),length)>0) 
last.list.index <- unlist(lapply(example.list, function(x) grep("c",x))) 

Idea jest taka: (nie pracuje, tak aby wykazać, co ja” m za)

lapply(list(a=first.list.index,b=last.list.index), function(a,b) example.list[[a]][[b]]) 

Edycja 3 (ostatniej edycji)

rzeczywiste dane Loo jaw tak: (I nadzieję na rozwiązanie z indeksowaniem I przewidzianego, to dlaczego ja zmniejszona na pytanie o to)

[[1]] 
[[1]][[1]] 
[1] "a" 

[[1]][[1]]$data 

[[1]][[2]] 
[[1]][[2]][[1]] 
[1] "b" 

[[1]][[1]]$data 

[[1]][[3]] 
[[1]][[3]][[1]] 
[1] "c" 

[[1]][[1]]$data 


[[2]] 
[[2]][[1]] 
[1] "c" 

[[2]][[1]]$data 

Przepraszam za ten bałagan!

Tutaj jest zmniejszona dput:

 list(list(structure(list(name = "a", data = c("21016954")), .Names = c("name", "data" 
    )), structure(list(name = "b", data = c("17103795")), .Names = c("name", "data")), structure(list(name = "c", 
    data = c("38036543")), .Names = c("name", "data"))), list(structure(list(name = "c", data = c("42456597")), .Names = c("name","data")))) 
+0

Czy możesz pokazać żądany wynik? –

+1

Spróbuj 'rapply (example.list, function (x) grep (" c ", x, value = TRUE))' – akrun

+1

Hmmm ... Właśnie napisałem fajną funkcję, aby dopasować twoje poprzednie pożądane wyjście. Bummer ... –

Odpowiedz

2

Twoja druga edycja jest wzdłuż prawej linii, ale trzeba użyć Map zamiast lapply. Korzystanie z danych

d <- list(list(structure(list(name = "a", data = c("21016954")), .Names = c("name", "data" 
    )), structure(list(name = "b", data = c("17103795")), .Names = c("name", "data")), structure(list(name = "c", 
    data = c("38036543")), .Names = c("name", "data"))), list(structure(list(name = "c", data = c("42456597")), .Names = c("name","data")))) 

Map(function(i, j) d[[i]][[j]], 
    i = which(lapply(lapply(d, function(x) grep("c",x)),length)>0), 
    j = unlist(lapply(d, function(x) grep("c",x)))) 

#[[1]] 
#[[1]]$name 
#[1] "c" 
# 
#[[1]]$data 
#[1] "38036543" 
# 
# 
#[[2]] 
#[[2]]$name 
#[1] "c" 
# 
#[[2]]$data 
#[1] "42456597" 
+0

tak, tak, rzeczywiście! Funkcja 'Map', której szukałem! Wielkie dzięki! – Maximilian