各グループごとにXXX(標準化など)したデータを作成する
今までは、例えば、下記のようなあるデータフレームのデータを、日付ごとにスケーリング(scale())し、その結果をデータフレームとして返すような処理として、以下のように書いていた。
これは「各日付ごとに全IDのデータ(r)列が存在し、それを日付ごとにスケーリングしたい!」という処理である。
(これはsummarizeだとうまくいかないので四苦八苦したあげく、以下のように書いていた)
> library("dplyr") > library("tidyr") > df <- data.frame(date=rep(Sys.Date() + 1:3, each=3), id=rep(1:3, 3), r=rpois(9, 2)) > df date id r 1 2016-07-22 1 1 2 2016-07-22 2 2 3 2016-07-22 3 1 4 2016-07-23 1 2 5 2016-07-23 2 0 6 2016-07-23 3 5 7 2016-07-24 1 4 8 2016-07-24 2 2 9 2016-07-24 3 0 > df %>% + group_by(date) %>% + do(tmp=data.frame(id=.$id, r=as.numeric(scale(.$r)))) %>% + unnest Source: local data frame [9 x 3] date id r <date> <int> <dbl> 1 2016-07-22 1 -0.5773503 2 2016-07-22 2 1.1547005 3 2016-07-22 3 -0.5773503 4 2016-07-23 1 -0.1324532 5 2016-07-23 2 -0.9271726 6 2016-07-23 3 1.0596259 7 2016-07-24 1 1.0000000 8 2016-07-24 2 0.0000000 9 2016-07-24 3 -1.0000000
で、
にて教えてもらったんだが、こんな面倒な書き方しなくても
> df %>% group_by(date) %>% mutate(r_scaled=scale(r)) Source: local data frame [9 x 4] Groups: date [3] date id r r_scaled (date) (int) (int) (dbl) 1 2016-07-22 1 1 -0.5773503 2 2016-07-22 2 2 1.1547005 3 2016-07-22 3 1 -0.5773503 4 2016-07-23 1 2 -0.1324532 5 2016-07-23 2 0 -0.9271726 6 2016-07-23 3 5 1.0596259 7 2016-07-24 1 4 1.0000000 8 2016-07-24 2 2 0.0000000 9 2016-07-24 3 0 -1.0000000
でOKだった。
シンプレ&ビューティー。