web-dev-qa-db-fra.com

Comment faire un sous-ensemble d'une liste dans R

J'ai une tâche assez simple mais je n'ai pas trouvé de bonne solution.

> 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)    

Je voudrais extraire de mylist les sous-éléments 3,5 et 9 de chaque composant de la liste ..__J'ai essayé, sapply[mylist,"[[",y] mais pas de chance !, et d’autres comme vapply, lapply, etc. Merci d'avance pour votre aide

Mauricio Ortiz 

28
user1257894

Vous pouvez utiliser sapply(mylist, "[", y):

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

Essayez d’utiliser [ au lieu de [[ (et en fonction de ce que vous voulez réellement, lapply).

De ?'[[':

La distinction la plus importante entre [ [[et $ est que le [can sélectionnez plus d'un élément alors que les deux autres sélectionnent un seul élément.

20
joran

Utiliser 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)]})
6
USER_1

purrr fournit une autre solution pour résoudre ce type de manipulation de liste dans l’inverse

library(purrr)
library(dplyr)

desired_values <- c(1,3)

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

mylist
3
DanO

Je ne pense pas que la réponse de sgibb donne ce que vous voudriez. Je suggère de créer une nouvelle fonction:

subsetList <- function(myList, elementNames) {
    lapply(elementNames, FUN=function(x) myList[[x]])
}

Ensuite, vous pouvez l'utiliser comme ceci:

x <- list(a=3, b="hello", c=4.5, d="world")
subsetList(x, c("d", "a"))
subsetList(x, c(4, 1))

Ces deux donnent 

[[1]]
[1] "world"

[[2]]
[1] 3

c'est ce que vous voudriez, je pense. 

0
toby544