2012-03-08 26 views
26

我有一個相當簡單的任務,但沒有找到一個好的解決方案。如何從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)  

我想從MYLIST子元素3,5和列表中的每個組件的9萃取。 我都試過了,但sapply[mylist,"[[",y]不是運氣!和其他人一樣vapply,lapply等。在此先感謝您的幫助

毛裏西奧·奧爾蒂斯

回答

16

嘗試使用[代替[[(並根據你」重新照亮你實際上想要lapply)。

?'[['

之間最重要的區別[[[和$是,[可 選擇一個以上的元素,而另外兩個選擇單個 元素。

26

你可以使用sapply(mylist, "[", y)

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

有這樣做的更好的方法,但這裏有一個快速的解決方案。

# 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

請使用'lapply',現在該解決方案無法擴展當mylist變得更大時。 – 2012-03-12 19:06:53

6

使用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提供了另一種解決方案爲tidyverse內解決這些類型的列表操作的

library(purrr) 
library(dplyr) 

desired_values <- c(1,3) 

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

mylist