R 如何从嵌套在多级列表中的数据中提取信息?

R 如何从嵌套在多级列表中的数据中提取信息?,r,list,loops,nested,iteration,R,List,Loops,Nested,Iteration,我试图从嵌套在lappy中的mappy生成的复杂列表中提取数据。 目的是生成具有不同输入组合的模型模拟。 如果有帮助,请参阅本文的其他内容: 输出是一个如下所示的列表: > output [[1]] [,1] [,2] [,3] Variable1 Numeric,2 Numeric,5 Numeric,7 Variable2 Integer,2 Integer,5 Integer,7 [[2]]

我试图从嵌套在
lappy
中的
mappy
生成的复杂列表中提取数据。 目的是生成具有不同输入组合的模型模拟。 如果有帮助,请参阅本文的其他内容:

输出是一个如下所示的列表:

> output
[[1]]
              [,1]      [,2]      [,3]           
Variable1     Numeric,2 Numeric,5 Numeric,7
Variable2     Integer,2 Integer,5 Integer,7

[[2]]
              [,1]      [,2]      [,3]           
Variable1     Numeric,2 Numeric,5 Numeric,7
Variable2     Integer,2 Integer,5 Integer,7
...
此结构在列表中重复n次,次数与
lappy
请求的次数相同。 我想为每一列(
[,1]
[,2]
[,3]
)从每个元素(
[[1]]
[[2]]
[[3]]
)中提取
Variable1
最后一个值

理想情况下,输出将是长格式的数据帧,列表级别和变量名随提取的值一起出现:

List_index    Column    Last_value_Variable1
[[1]]         [,1]      5
[[1]]         [,2]      2
[[1]]         [,3]      7
[[2]]         [,1]      8
[[2]]         [,2]      1
[[2]]         [,3]      9
...           ...     ...
如有必要,可以重命名列表索引和变量名。 我不确定我要处理的对象是什么类型的(一个列表,但里面嵌套了列表…,还有一点不同…)。 我知道如何手动访问较低级别的最后一个元素(下面的代码),但不知道如何迭代流程

> output[[1]][,1]$Variable1[-1]
5
> output[[2]][,3]$Variable1[-1]
9
output
上使用
dput
返回一个类似这样的值(由于实际值太长而简化):

该模型是一个函数,它返回一个包含16个变量的数据帧,以及与其中一个模型输入相对应的可变数量的观测值。使用一组11个参数输入测试模型(因此在上面的
dput()
中使用
.Dim=c(16L,11L)

我需要对不同输入的组合进行模拟。 列表的第一级(
[[i]]
)对应于一个参数输入范围(输入到
lappy
函数),第二级(
[,j]
)对应于另一组输入到
mappy
函数的参数(在本例中为11)。

一般来说(由于未提供数据),这应该很有效:

sapply(output, function(x) x[,1]$Variable1[-1])
列表可能很复杂(你的看起来也很复杂),在我看来,提取一个值时所做的是正确的第一步。然后,您只需考虑如何编写一个函数来访问此元素,并将其放入另一个*apply循环中,使其在列表的每个元素上工作


另一方面,我现在可能会使用
purrr::map_int()
,因为它确保您从每次迭代中得到的是一个单一的整数值。

@JCGruber的建议帮助我找到了一个解决方案。 我在
sapply
周围包装了一个
for
循环,以对列表的每个子元素重复提取过程(在我的示例11中)


l您能用
dput()
提供一个数据示例吗?这使得编写答案变得更加困难。不幸的是,当我尝试在属性(.Data)中创建对象
错误时,我遇到了一个错误。tidyr软件包中的
unnest_longer()
可能在这里非常有帮助。感谢@JBGruber的回答和鼓励。我认为你让我在
sapply
方面走上了一条好路。我是编程新手,但访问嵌套列表的元素如此复杂似乎很奇怪!我已经使用
dput()
添加了一段数据摘录,如果这有帮助的话……列表非常灵活,但有时使用起来有点笨拙。值得注意的是,整个tidyverse都基于这样一个想法,即在可能的情况下只使用
data.frames
,以简化工作。
sapply(output, function(x) x[,1]$Variable1[-1])
l <- list()
for (i in 1:11)){
  l[i] <- as.data.frame(sapply(output, function(x) tail(x[,i]$Variable1, 1)), 4)
}
> l
[[1]]
[1]  0.8794 23.7201 46.5609

[[2]]
[1]  5.4517 25.7046 45.9574

[[3]]
[1]  8.6468 26.0620 43.4773

[[4]]
[1] 25.3687 40.9850 56.6014

[[5]]
[1] 28.9796 41.0070 53.0343

[[6]]
[1]  0.913 23.699 46.485

[[7]]
[1] 34.3093 45.8173 57.3253

[[8]]
[1] 30.9206 42.1212 53.3218

[[9]]
[1]  0.9130 22.4922 44.0714

[[10]]
[1] 44.4389 57.3425 70.2460

[[11]]
[1] 57.3268 67.5774 77.8280