在R中,我有一个由12个子列表组成的列表,每个列表本身都由5个子子列表组成,如下所示:
在此示例中,我想为每个子列表提取信息“ 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"]]
我想暂时避免。
感谢您的帮助。
答案 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项,它也将起作用。