各グループごとに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だった。
シンプレ&ビューティー。