列表的子集的子集

时间:2018-11-28 17:12:47

标签: r list sublist

在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"]]

我想暂时避免。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

此功能的好处是,如果我们有多个嵌套元素,则不必调用n lapply,并且应该更快


或使用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"

这确实是行不通的。但是,它不能与声称也可行的解决方案一起使用。

答案 1 :(得分:0)

一个选项是嵌套的lapply:

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

此方法优于@akrun的方法的好处(在这种情况下可能并不重要)是,即使列表中的某些元素没有$ statistics $ MSD项,它也将起作用。