我有一个相当简单的任务,但没有找到一个好的解决方案。
> 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等等。提前感谢您的帮助
Mauricio Ortiz
答案 0 :(得分:29)
您可以使用sapply(mylist, "[", y)
:
mylist <- list(1:5, 6:10, 11:15)
sapply(mylist, "[", c(2,3))
答案 1 :(得分:22)
尝试使用[
代替[[
(并根据您实际需要的内容lapply
)。
来自?'[['
:
最重要的区别[,[[和$是[可以 选择多个元素,而另外两个选择一个元素 元件。
答案 2 :(得分:3)
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
答案 3 :(得分:0)
我不认为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
我认为这是你想要的。
答案 4 :(得分:0)
一种简单的方法来对列表中重复命名的元素进行子集,类似于此处的其他答案。
(,以便下次查看此问题时可以找到它)
例如,将一个重复列表中的"b"
个元素作为子集,其中每个元素都包含一个"a"
和"b"
子元素:
mylist <- list(
list(
"a" = runif(3),
"b" = runif(1)
),
list(
"a" = runif(3),
"b" = runif(1)
)
)
mylist
#> [[1]]
#> [[1]]$a
#> [1] 0.7547490 0.6528348 0.2339767
#>
#> [[1]]$b
#> [1] 0.8815888
#>
#>
#> [[2]]
#> [[2]]$a
#> [1] 0.51352909 0.09637425 0.99291650
#>
#> [[2]]$b
#> [1] 0.8407162
blist <- lapply(
X = mylist,
FUN = function(x){x[["b"]]}
)
blist
#> [[1]]
#> [1] 0.8815888
#>
#> [[2]]
#> [1] 0.8407162
由reprex package(v0.3.0)于2019-11-06创建
答案 5 :(得分:-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