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でやればよさそうだと、書きながら気づきました。