【问题标题】:subset of a subset of a list列表子集的子集
【发布时间】:2018-11-28 17:12:46
【问题描述】:

在 R 中,我有一个列表,由 12 个子列表组成,每个子列表由 5 个子列表组成,如下所示

lists and sublists

在本例中,我想为每个子列表提取信息“MSD”。

我可以使用

提取每个级别的“统计信息”
lapply(letters, '[[', "statistics")

效果很好。它给了我包含在子列表“统计”中的所有值,对于每个列表 但是,我想再降低一层,因为我对其他数据不感兴趣,例如 MSerror、Df、..... 只有 MSD

我试过了

lapply(letters, '[[', "statistics", "MSD")

还有许多其他人没有成功。

如果我只想要第一个子列表,它将与

letters[[1]][["statistics"]][["MSD"]]

但是,我必须这样做:

letters[[1]][["statistics"]][["MSD"]]
letters[[2]][["statistics"]][["MSD"]]
letters[[3]][["statistics"]][["MSD"]]

我想暂时避免。

感谢您的帮助。

【问题讨论】:

  • 我忘了说,我看到了获取子列表的帖子。但不是关于如何降低一层,并获得“子子列表”
  • 如果 'MSD' 始终存在,您也可以使用 for 循环,因此您将拥有 letters[[i]][["statistics"]][["MSD"]]

标签: r list sublist


【解决方案1】:

我们可以使用 lambda/匿名函数

lapply(letters, function(x) x[["statistics"]][["MSD"]])

这个函数的好处是,如果我们有多个嵌套元素,就不用调用nlapply,应该会更快


或使用map

library(tidyverse)
map(letters, ~ .x[["statistics"]][["MSD"]])

另外,关于如果list 中没有某些元素,这将不起作用的说法,

set.seed(24)
lst1 <- replicate(3,  list(statistics = list(MSD = rnorm(20))))
names(lst1)[2] <- "Hello"

确实不行。但是,它不适用于声称也有效的解决方案。

【讨论】:

    【解决方案2】:

    一个选项是嵌套的 lapply:

    lapply(lapply(letters, '[[', "statistics"),`[[`,"MSD")
    

    与@akrun 的方法相比,这种方法的好处在这种情况下可能不相关,即使列表中的某些元素没有 $statistics$MSD 项,它也可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多