подмножество подмножества списка - PullRequest
0 голосов
/ 28 ноября 2018

В R у меня есть список, состоящий из 12 подсписков, каждый из которых состоит из 5 подсписков, как следует

списки и подсписки

В этом примере яЯ хочу извлечь информацию "MSD" для каждого из этих подсписков.

Я могу извлечь уровень "статистика" для каждого, используя

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

Это сработало хорошо.Он дал мне все значения, содержащиеся в подсписке «статистика», для каждого списка. Однако я хочу перейти на один уровень ниже, так как меня не интересуют другие данные, такие как MSerror, Df, ..... OnlyMSD

Я пытался

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

и многие другие безуспешно.

Если я хотел только первый подсписок, он будет работать с

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

но тогда я должен сделать:

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

, которых я хочу избежать на некоторое время.

спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Один из вариантов - вложенная помпа:

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

Преимущество этого подхода @ akrun, который в данном случае может быть неактуальным, заключается в том, что он будет работать, даже если некоторые элементы внутрив списке нет элемента $ статистики $ MSD.

0 голосов
/ 28 ноября 2018

Мы можем использовать лямбда / анонимную функцию

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"

Это правда, что это не сработает.Тем не менее, оно не будет работать с решением, которое, как утверждается, также работает.

...