多亏了@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()
需要一些时间。
- 数据、子集和模型保存在一
如果您有一些见解/评论,将很高兴得到一些反馈。