LoginSignup
1
0

More than 5 years have passed since last update.

dplyr::group_byでグループ化したものをループする

Posted at

group_byしたものは、基本的にはsummarizeするのが順当な使い方ですが、group_byされたグループごとに、処理を回したい場合はどうすればよいでしょうか?

summarize()

標準の方法ではどこまでできるのでしょうか?
docにあるように、以下のような集約関数が用意されています。

Center: mean(), median()
Spread: sd(), IQR(), mad()
Range: min(), max(), quantile()
Position: first(), last(), nth(),
Count: n(), n_distinct()
Logical: any(), all()

これらの集約処理ではなく、groupごとに、フィルターをかけたり、再集約をかけたりもできるとは思いますが、処理が入れ子になりすぎると、結果が想像しがたくなるのは難点です。groupごとにシンプルに処理したい場合はどうすればよいでしょうか?

無理やりtidyr::nestする

いくら探しても、grouped_df形式のままイテレートする方法が無かったので、tidyrのnestを使って、フラット化してばらしてしまう方法を使いました。
実はforeachでグループごとに並列化したかったのが、動機でしたので、以下のようにしてみました。

    grouped_df <- df %>% group_by(key) 
    cl <- makeCluster(cores)
    registerDoParallel(cl)
    groups <- grouped_df %>% nest
    applied <- foreach(i = 1:nrow(groups)) %dopar% {
        some_function(groups$data[i])
    }

そもそも、この場合はgroup_byせずに、splitでやればよさそうだと、書きながら気づきました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0