なんかこれもう常識?な感じが漂ってるので書くの恥ずかしいけど、割とよくつまづくのでメモ。
こんな感じの、累積値が記録されてるデータがあるとする。
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 thandiff()
because forn
inputsdiff()
returnsn - 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
が入ってしまうので油断してはいけないけど。