【问题标题】:R Subsetting nested lists, select multiple entriesR子集嵌套列表,选择多个条目
【发布时间】: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说

标签: r list nested subset


【解决方案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]]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2020-07-18
      • 2021-08-02
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      相关资源
      最近更新 更多