183  差の計算のRでの実践

library(tidyverse)

それでは、ここからは、lag、leadなどの関数の動作をRで見ていきましょう。

まずは、スライドで紹介した関数のベクトルに対する動作を改めて確認しておきます。

vec <- c(1,2,3,4,5)

dplyr::lag(vec)
[1] NA  1  2  3  4
dplyr::lead(vec)
[1]  2  3  4  5 NA
dplyr::first(vec)
[1] 1
dplyr::last(vec)
[1] 5
dplyr::nth(vec,3)
[1] 3

これらの関数の動作、イメージ通りでしょうか。lagが後ろにずらし、leadが前にずらしfirstが一番目の要素lastが最後の要素nthがn番目の要素を取り出すという関数になっています。

tibbleの列に対しても実行してみましょう

dat <- tibble(
  a = c(1,2,3,4,5)
)

dat %>% 
  mutate(
    a_lag=lag(a),
    a_lead = lead(a),
    a_first = first(a),
    a_last = last(a),
    a_third = nth(a,3)
  )
# A tibble: 5 × 6
      a a_lag a_lead a_first a_last a_third
  <dbl> <dbl>  <dbl>   <dbl>  <dbl>   <dbl>
1     1    NA      2       1      5       3
2     2     1      3       1      5       3
3     3     2      4       1      5       3
4     4     3      5       1      5       3
5     5     4     NA       1      5       3

いかがでしょうか?

スライドでの説明通りに動いていますね?

group_byを入れてあげる場合も

dat <- tibble(
  id = c(1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3),
  v  = c(11,12,13,14,21,22,23,24,31,32,33,34) 
)

dat %>% 
  mutate(
    v_lag=lag(v),
    v_lead = lead(v),
    v_first = first(v),
    v_last = last(v)
  )
# A tibble: 12 × 6
      id     v v_lag v_lead v_first v_last
   <dbl> <dbl> <dbl>  <dbl>   <dbl>  <dbl>
 1     1    11    NA     12      11     34
 2     1    12    11     13      11     34
 3     1    13    12     14      11     34
 4     1    14    13     21      11     34
 5     2    21    14     22      11     34
 6     2    22    21     23      11     34
 7     2    23    22     24      11     34
 8     2    24    23     31      11     34
 9     3    31    24     32      11     34
10     3    32    31     33      11     34
11     3    33    32     34      11     34
12     3    34    33     NA      11     34

こんな感じの結果が、

dat %>%
  group_by(id) %>% 
  mutate(
    v_lag=lag(v),
    v_lead = lead(v),
    v_first = first(v),
    v_last = last(v)
  )
# A tibble: 12 × 6
# Groups:   id [3]
      id     v v_lag v_lead v_first v_last
   <dbl> <dbl> <dbl>  <dbl>   <dbl>  <dbl>
 1     1    11    NA     12      11     14
 2     1    12    11     13      11     14
 3     1    13    12     14      11     14
 4     1    14    13     NA      11     14
 5     2    21    NA     22      21     24
 6     2    22    21     23      21     24
 7     2    23    22     24      21     24
 8     2    24    23     NA      21     24
 9     3    31    NA     32      31     34
10     3    32    31     33      31     34
11     3    33    32     34      31     34
12     3    34    33     NA      31     34

mutateだとこうなって、

summariseだと、

dat %>%
  group_by(id) %>% 
  summarise(
    v_first = first(v),
    v_last = last(v),
    v_second = nth(v,2)
  )
# A tibble: 3 × 4
     id v_first v_last v_second
  <dbl>   <dbl>  <dbl>    <dbl>
1     1      11     14       12
2     2      21     24       22
3     3      31     34       32

こうなりました。

いかがでしょうか?

ここでご紹介した関数を利用すれば、縦方向に時系列で保存されているデータから、差や比等を抽出することできそうですね?

次の動画では、これらの関数を利用した課題をお出しいたします。