Извлечь объект из списка с помощью dplyr

Это связано с вопросами 1 и 2

У меня есть список объектов (в моем случае это также списки AFAII), который возвращается при запуске:

gof_stats <- models %>% map(gof_stats)

Где models — это список моделей, созданных fitdistrplus, а gof_stats — это функция, которая вычисляет статистику соответствия для каждой модели.

Теперь, если я хочу извлечь определенную статистику из этого списка, я могу сделать что-то вроде:

gof_stats[[1]]$cvm

чтобы получить статистику Крамера фон Мизеса. Я могу добиться того же по всему списку (согласно связанным вопросам), например:

cvms <- sapply(gof_stats, "[[", "cvm")

Есть ли способ сделать то же самое, используя синтаксис dplyr/purrr?

БОНУС: как бы вы справились со случаем, когда некоторые элементы в списке models равны NULL?


person Bar    schedule 08.07.2016    source источник


Ответы (1)


Если вы предпочитаете map вместо sapply для этого, вы можете сделать

library(purrr)
map(gof_stats, ~ .x[["cvm"]])

Если вам просто нравятся трубы, вы можете сделать

gof_stats %>% sapply("[[", "cvm")

Ваш вопрос касается списков, а не фреймов данных, поэтому dplyr на самом деле не применяется. Вы можете найти ?magrittr::multiply_by, чтобы увидеть список других псевдонимов из пакета, который определяет %>% как вам нравится конвейер. Например, magrittr::extract2 — это псевдоним [[, который можно легко использовать в середине цепочки трубопроводов.

Что касается вашего бонуса, я бы предварительно отфильтровал список, чтобы удалить NULL элементов, прежде чем пытаться извлечь что-то.

person Gregor Thomas    schedule 08.07.2016
comment
Не могли бы вы объяснить, что делает тильда ~ в решении карты? - person Bar; 09.07.2016
comment
См. ?map в разделе Аргументы, .f, Если формула, например, ~ .x + 2.... Он также используется в примерах. Если вам нужны подробности, взгляните на виньетку lazyeval пакет. По сути, ~ используется для приведения следующего выражения к формуле. - person Gregor Thomas; 09.07.2016
comment
Или просто cvm, потому что строковые входы используются как индексы - person hadley; 09.07.2016