メモ:dplyrの中で使うのはdiff()じゃなくてlag()

なんかこれもう常識?な感じが漂ってるので書くの恥ずかしいけど、割とよくつまづくのでメモ。

こんな感じの、累積値が記録されてるデータがあるとする。

library(dplyr)
d <- data_frame(a = 1:10, b = cumsum(a))
d
#>     a  b
#> 1   1  1
#> 2   2  3
#> 3   3  6
#> 4   4 10
#> 5   5 15
#> 6   6 21
#> 7   7 28
#> 8   8 36
#> 9   9 45
#> 10 10 55

これの差分を求めたいときdiff()だとエラーが出る。

d %>%
  mutate(c = diff(b))
#> Error: wrong result size (9), expected 10 or 1

この理由は、diffが返すのは引数よりひとつ少ない結果だからで、dplyrのvignette(vignette("window-functions")/Window functions and grouped mutate/filter)の「Lead and lag」という節を見ると言及がある。

Using lag() is more convenient than diff() because for n inputs diff() returns n - 1 outputs.

lag()を使えばいいらしい。こんな感じ。

d %>%
  mutate(c = b - lag(b))
#> Source: local data frame [10 x 3]
#> 
#>     a  b  c
#> 1   1  1 NA
#> 2   2  3  2
#> 3   3  6  3
#> 4   4 10  4
#> 5   5 15  5
#> 6   6 21  6
#> 7   7 28  7
#> 8   8 36  8
#> 9   9 45  9
#> 10 10 55 10

NAが入ってしまうので油断してはいけないけど。