在R中,我有一个列表,由12个子列表组成,每个子列表本身由5个子集合组成,如下所示
列表和子列表
在这个例子中,我想提取每个子列表的信息"MSD"。
我可以使用提取每个级别的"统计信息">
lapply(letters, '[[', "statistics")
效果很好。它为我提供了子列表"statistics"中包含的每个列表的所有值然而,我想再往下一层,因为我对其他数据不感兴趣,比如MSerror、Df。。。。。仅MSD
我试过
lapply(letters, '[[', "statistics", "MSD")
以及许多其他没有成功的案例。
如果我只想要第一个子列表,它将与一起工作
letters[[1]][["statistics"]][["MSD"]]
但是,我必须做:
letters[[1]][["statistics"]][["MSD"]]
letters[[2]][["statistics"]][["MSD"]]
letters[[3]][["statistics"]][["MSD"]]
我想暂时避免。
谢谢你的帮助。
我们可以使用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"
的确,它不会起作用。然而,它不适用于声称有效的解决方案。
一个选项是嵌套的lapply:
lapply(lapply(letters, '[[', "statistics"),`[[`,"MSD")
与@akrun的方法相比,这种方法的好处是,即使列表中的某些元素没有$statistics$MSD项,它也能工作,在这种情况下,这种方法可能与此无关。