2012-03-08 11 views
26

Tengo una tarea bastante simple pero no he encontrado una buena solución.Cómo subconjunto de una lista en 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)  

me gustaría extraer de mylist los subelementos de 3,5, y 9 de cada componente en la lista. he intentado, pero no sapply[mylist,"[[",y] suerte !, y otros como vapply, lapply, etc .. Gracias de antemano por su ayuda

Mauricio Ortiz

Respuesta

16

Trate de usar en lugar de [[[ (y dependiendo de lo que' re after you light realmente quiere lapply).

De ?'[[':

La distinción más importante entre [[[$ y es que el [ puede seleccionar más de un elemento, mientras que los otros dos seleccionar un solo elemento .

26

Usted podría utilizar sapply(mylist, "[", y):

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

Hay mejores maneras de hacer esto, pero esto es una solución rápida.

# 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

Utilice 'lapply', en este momento esta solución no escala en absoluto cuando 'mylist' se vuelve más grande. –

6

Usando 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 proporciona otra solución para resolver este tipo de manipulaciones dentro de la lista de tidyverse

library(purrr) 
library(dplyr) 

desired_values <- c(1,3) 

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

mylist 
Cuestiones relacionadas