2012-03-08 10 views
26

Mam raczej proste zadanie, ale nie znalazłem dobrego rozwiązania.Jak podzbiór z listy w R

> mylist 
[[1]] 
[1] 1 2 3 4 5 6 7 8 9 10 

[[2]] 
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" 

[[3]] 
[1] 25 26 27 28 29 30 31 32 

y <- c(3,5,9)  

ja do ekstrakcji z wypożyczane pod-elementy 3,5 i 9 każdego składnika na liście. Próbowałem, ale nie sapply[mylist,"[[",y] szczęście !, i inni podobni vapply, lapply itp .. Dzięki z góry za pomoc

Mauricio Ortiz

Odpowiedz

16

Spróbuj użyć [ zamiast [[ (w zależności od tego czego po tym, jak światło faktycznie chce lapply).

Od ?'[[':

Najważniejsza różnica między [[[$ i jest to, że [może wybrać więcej niż jeden element, podczas gdy dwa pozostałe wybrać pojedynczy element.

26

Można użyć sapply(mylist, "[", y):

mylist <- list(1:5, 6:10, 11:15) 
sapply(mylist, "[", c(2,3)) 
-1

Są lepsze sposoby na zrobienie tego, ale tutaj jest szybkie rozwiązanie.

# your values 
list1<-1:10 
list2<-letters[1:26] 
list3<-25:32 

# put 'em together in a list 
mylist<-list(list1,list2,list3) 

# function 
foo<-function(x){x[c(3,5,9)]} 

# apply function to each of the element in the list 
foo(mylist[[1]]) 
foo(mylist[[2]]) 
foo(mylist[[3]]) 

# check the output 

> foo(mylist[[1]]) 
[1] 3 5 9 
> foo(mylist[[2]]) 
[1] "c" "e" "i" 
> foo(mylist[[3]]) 
[1] 27 29 NA 
+2

Proszę użyć 'lapply', teraz to rozwiązanie nie skaluje w ogóle kiedy 'mylist' staje się większy. –

6

Korzystanie lapply:

# create mylist 
list1<-1:10 
list2<-letters[1:26] 
list3<-25:32 
mylist<-list(list1,list2,list3) 

# select 3,5,9th element from each list 
list.2 <- lapply(mylist, function(x) {x[c(3,5,9)]}) 
2

purrr przewiduje innego rozwiązania do rozwiązywania tego rodzaju lista manipulacji w tidyverse

library(purrr) 
library(dplyr) 

desired_values <- c(1,3) 

mylist <- list(1:5, letters[1:6], 11:15) %>% 
purrr::map(`[`,desired_values) 

mylist