Сравнение 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() занимает немного времени.

Если у вас есть некоторые идеи / замечания, будем рады получить некоторые отзывы.

0 ответов

Другие вопросы по тегам