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子集嵌套列表,选择多个条目的主要内容,如果未能解决你的问题,请参考以下文章

R语言学习:提取R对象的子集

给出两个端点列表选择整数子集

使用嵌套查询从表列表/多个表中选择 - MS SQL

如何解决棱镜中的子选择/关系(嵌套列表)

选择和修改嵌套向量中的条目的最佳实践

使用 Python 从 s 系列列表中选择项目