dplyr :: do/purrr :: map比较,有什么优势?

aur*_*ien 27 r dplyr tidyr broom

当使用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
Run Code Online (Sandbox Code Playgroud)

在阅读了@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
Run Code Online (Sandbox Code Playgroud)

订单改变了,但结果是一样的.

鉴于两者在很大程度上解决了相同的用例,我想知道这两种方法是否会得到支持.方法会成为规范的tidyverse方法吗?如果不考虑规范,哪些用例要求继续支持这两种方法?

根据我的短暂经历:

    • 进度条,很好的计算很多模型.
    • @Axeman评论:可以使用并行化 multidplyr
    • 较小的对象,但如果我们想要broom::glancefx 则需要重新运行.
  • 地图
    • 数据,子集和模型保持在一个 tbl_df
    • 容易提取模型的另一个组件,即使unnest()需要一点时间.

如果您有一些见解/评论,将很乐意收到一些反馈.