Сравнение dplyr::do / purrr::map, какие преимущества?
Когда используешь broom
Я привык сочетать dplyr::group_by
а также dplyr::do
выполнять действия над сгруппированными данными благодаря @drob. Например, установка линейной модели на автомобили в зависимости от системы передач:
library("dplyr")
library("tidyr")
library("broom")
# using do()
mtcars %>%
group_by(am) %>%
do(tidy(lm(mpg ~ wt, data = .)))
# Source: local data frame [4 x 6]
# Groups: am [2]
# am term estimate std.error statistic p.value
# (dbl) (chr) (dbl) (dbl) (dbl) (dbl)
# 1 0 (Intercept) 31.416055 2.9467213 10.661360 6.007748e-09
# 2 0 wt -3.785908 0.7665567 -4.938848 1.245595e-04
# 3 1 (Intercept) 46.294478 3.1198212 14.838824 1.276849e-08
# 4 1 wt -9.084268 1.2565727 -7.229401 1.687904e-05
Прочитав недавний пост от @hadley о tidyr v0.4.1
Я обнаружил, что то же самое может быть достигнуто с помощью nest()
а также purrr::map()
Тот же пример, что и раньше:
by_am <- mtcars %>%
group_by(am) %>%
nest() %>%
mutate(model = purrr::map(data, ~ lm(mpg ~ wt, data = .)))
by_am %>%
unnest(model %>% purrr::map(tidy))
# Source: local data frame [4 x 6]
# am term estimate std.error statistic p.value
# (dbl) (chr) (dbl) (dbl) (dbl) (dbl)
# 1 1 (Intercept) 46.294478 3.1198212 14.838824 1.276849e-08
# 2 1 wt -9.084268 1.2565727 -7.229401 1.687904e-05
# 3 0 (Intercept) 31.416055 2.9467213 10.661360 6.007748e-09
# 4 0 wt -3.785908 0.7665567 -4.938848 1.245595e-04
Порядок изменился, но результаты остались прежними.
Учитывая, что оба они в значительной степени касаются одного и того же варианта использования, мне интересно, будут ли поддерживаться оба подхода в будущем. Будет ли метод стать каноническим tidyverse
путь? Если один из них не считается каноническим, то какие варианты использования требуют, чтобы оба подхода продолжали поддерживаться?
Из моего короткого опыта:
- делать
- Индикатор выполнения, приятно, когда вычисляется много моделей.
- Комментарий @Axeman: можно распараллелить, используя
multidplyr
- меньший объект, но нужно повторно запустить, если мы хотим
broom::glance
FX.
- карта
- данные, подмножества и модели хранятся в одном
tbl_df
- легко извлечь другой компонент модели, даже если
unnest()
занимает немного времени.
- данные, подмножества и модели хранятся в одном
Если у вас есть некоторые идеи / замечания, будем рады получить некоторые отзывы.