R子集嵌套列表,选择多个条目
Posted
技术标签:
【中文标题】R子集嵌套列表,选择多个条目【英文标题】:R Subsetting nested lists, select multiple entries 【发布时间】:2022-01-18 15:19:36 【问题描述】:我经常处理大型数据集,导致我有时会创建嵌套列表以减少环境中的对象。
当对这样的列表进行子集化并希望在所有步骤中转到第一个条目时,它看起来像这样:
llra[[1]][[1]][[1]]
在我当前的一些脚本中,这些脚本中的数据与列表中最后一步的每个条目都是可比较的。如果我想比较这些或进行计算,它看起来像这样:
mean(llra[[1]][[1]][[1]], llra[[1]][[2]][[1]], llra[[1]][[3]][[1]])
有没有办法对它们进行不同的子集化,所以我可以这样写:
mean(llra[[1]][[c(1:3)]][[1]])
感谢您的帮助!
【问题讨论】:
列表的最终元素包括什么?单个数字、向量、数据框?llra[[1]][1:3][[1]]
到子集列表。
llra[[1]][1:3][[1]]
将返回列表的第一个列表llra[[1]][1:3]
在我的情况下,最终元素包括光栅层,但是这样做时: llra[[1]][1:3][[1]] 它只返回三个中的第一个列表,如 utubun说
【参考方案1】:
感谢您的回答,格洛腾迪克和诺沃特尼的方法都有效。 我简化了我的示例,因为我在列表的最后一步中使用了栅格图层,所以我让它像这样工作:
解开方法:
mean(stack(unravel(llra, 1, 1:3,1)))
地图方法:
mean(stack(map(1:3, ~llra[[1]][[.x]][[1]])))
这似乎是一个基本的东西,奇怪的是它还没有在 R 中实现。
【讨论】:
【参考方案2】:创建一个小的辅助函数。这将创建一个索引网格并提取每个索引。最后它不列出结果。没有使用任何包。
unravel <- function(L, ...)
if (...length()) L <-
apply(expand.grid(...), 1, function(ix) L[[ix]], simplify = FALSE)
unlist(L)
# test
L <- list(a = list(b = list(1:3, 4:5), c = list(11:12, 20:25)))
# Example 1
mean(unravel(L, 1, 1:2, 1))
## [1] 5.8
# check
mean(c(L[[1]][[1]][[1]], L[[1]][[2]][[1]]))
## [1] 5.8
# Example 2
mean(unravel(L, 1, 1, 1:2))
## [1] 3
# check
mean(c(L[[1]][[1]][[1]], L[[1]][[1]][[2]]))
## [1] 3
更新
对 unravel 进行概括,使其不假定三个级别或将哪些级别指定为标量或向量索引。
【讨论】:
您能否解释一下 ...length() 的作用? 它是作为 ... 传递的数字参数。看 ?...length 如果我们调用 unravel(L) 那么 expand.grid 将失败,所以我们单独处理这种情况。【参考方案3】:您可以使用purrr::map
。
mean(map_dbl(1:3, ~llra[[1]][[.x]][[1]]))
【讨论】:
以上是关于R子集嵌套列表,选择多个条目的主要内容,如果未能解决你的问题,请参考以下文章