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が必要な場合は再実行する必要があります。
  • 地図
    • データ、サブセット、およびモデルが 1 つに保持されますtbl_df
    • unnest()少し時間がかかる場合でも、モデルの別のコンポーネントを簡単に抽出できます。

洞察やコメントがあれば、喜んでフィードバックをお寄せください。

4

0 に答える 0