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