如何获得R中列表列表的特定元素?

时间:2017-08-16 10:49:08

标签: r

我构建了我的功能(这么长而复杂)。我的函数的输出是两个列表的列表。为了使我的问题清楚,我构建了一个类似于我的函数的简单示例。

my_func <- function(x,y){
  out1 <- list(x*y+2,x+y^2)
  out2 <- list(x^2+y-2,y-x^2)

  out <- list(out1,out2)
  return(out)
}

然后我明白了:

> x <- my_func(x=c(2,3,4),y=c(5,4,7))
> x
[[1]]
[[1]][[1]]
[1] 12 14 30

[[1]][[2]]
[1] 27 19 53


[[2]]
[[2]][[1]]
[1]  7 11 21

[[2]][[2]]
[1]  1 -5 -9

我需要将我的功能应用于100种不同的数据。然后,我将从两个列表中获得100输出。我如何使用lapply函数来获取特定元素。

尝试了这个:

> x <- lapply(x,'[[','2')
> x
[[1]]
NULL

[[2]]
NULL

但是,在我的原始函数中,我使用以下代码来访问该元素。

> x[[1]][[1]]$par  ##to get the first par (of list 1)  of the first output list. 
         [,1]     [,2]     [,3]     [,4] [,5]
[1,] 0.000000 0.000000 0.000000 0.000000    0
[2,] 2.545870 0.000000 0.000000 0.000000    0
[3,] 3.060626 2.879527 0.000000 0.000000    0
[4,] 2.015691 2.889324 2.967189 0.000000    0
[5,] 2.862635 2.511020 2.480592 1.781923    0

如何使用lapply函数访问第一个和第二个列表中的所有$par?有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

如果使用的索引是numeric,我们不需要引号。引号使list检查与该字符匹配的names。所以,

lapply(x, `[[`, 2)
#[[1]]
#[1] 27 19 53

#[[2]]
#[1]  1 -5 -9

如果我们已经命名了子列表,那么OP的方法将起作用

x1 <- lapply(x,  setNames, 1:2)
lapply(x1, `[[`, '2')
#[[1]]
#[1] 27 19 53

#[[2]]
#[1]  1 -5 -9
相关问题