Как подмножество из списка в R - PullRequest
29 голосов
/ 09 марта 2012

У меня довольно простая задача, но я не нашел хорошего решения.

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

Я хотел бы извлечь из mylist подэлементы 3,5 и 9 каждого компонента в списке. Я пробовал, sapply[mylist,"[[",y], но не удача !, и другие, такие как vapply, lapply, и т.д .. Заранее спасибо за вашу помощь

Маурисио Ортис

Ответы [ 6 ]

30 голосов
/ 09 марта 2012

Вы можете использовать sapply(mylist, "[", y):

mylist <- list(1:5, 6:10, 11:15)
sapply(mylist, "[", c(2,3))
22 голосов
/ 09 марта 2012

Попробуйте использовать [ вместо [[ (и в зависимости от того, что вы после того, как вы на самом деле хотите, чтобы lapply).

С ?'[[':

Самое важное различие между [, [[и $ в том, что [может выберите более одного элемента, тогда как другие два выберите один элемент.

7 голосов
/ 23 ноября 2015

Использование 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)]})
3 голосов
/ 14 декабря 2016

purrr предоставляет другое решение для решения этих видов манипуляций со списком в пределах тидиверса

library(purrr)
library(dplyr)

desired_values <- c(1,3)

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

mylist
0 голосов
/ 03 апреля 2018

Я не думаю, что ответ sgibb дает то, что вы хотели бы.Я предлагаю сделать новую функцию:

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

Тогда вы можете использовать ее следующим образом:

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

Они оба дают

[[1]]
[1] "world"

[[2]]
[1] 3

, что вы быхочу, думаю.

0 голосов
/ 09 марта 2012

Есть лучшие способы сделать это, но вот быстрое решение.

# 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
...