28

多亏了@drob,broom我在使用时习惯于对分组数据进行组合和dplyr::group_by执行操作。dplyr::do例如,根据齿轮系统为汽车拟合线性模型:

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()需要一些时间。

如果您有一些见解/评论,将很高兴得到一些反馈。

4

0 回答 0