lag関数の仕様について


[時系列データでラグを取った場合のNAへの対処](https://ja.stackoverflow.com/questions/36256/%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E3%83%A9%E3%82%B0%E3%82%92%E5%8F%96%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AEna%E3%81%B8%E3%81%AE%E5%AF%BE%E5%87%A6)  
で質問させていただいたものです。

df[,i]は問題ないのですがlag(df[,i])をとるとすべてNAとなってしまいます。  
そのため差をとるとやはりすべてがNAになるようです。  
df[,i]のclassは[1] "tbl_df" "tbl" "data.frame"でした。

この場合どのように対処すればよいでしょうか。  
入っている数値が小数ばかりなのがまずいということはあるでしょうか。

よろしくお願いいたします。




これは，`df` が `tibble` だからではないでしょうか．

`df1` が

[code]

    df1 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, col5 = 1:10)
    
[/code]

`df2` が

[code]

    library(dplyr)
    df2 <- data_frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, 
      col5 = 1:10)
    
[/code]

とすると，`class` は，

[code]

    class(df1)
    #> [1] "data.frame"
    class(df2)
    #> [1] "tbl_df"     "tbl"        "data.frame"
    
[/code]

です．`df[,i]` で列を取り出すと，`df1`では`vector`，`df2`では`tibble`になります．

[code]

    df1[, 1]
    #>  [1]  1  2  3  4  5  6  7  8  9 10
    df2[, 1]
    #> # A tibble: 10 x 1
    #>     col1
    #>    <int>
    #>  1     1
    #>  2     2
    #>  3     3
    #>  4     4
    #>  5     5
    #>  6     6
    #>  7     7
    #>  8     8
    #>  9     9
    #> 10    10
    
[/code]

なので，`lag()`をとると，

[code]

    lag(df1[, 1])
    #>  [1] NA  1  2  3  4  5  6  7  8  9
    lag(df2[, 1])
    #> # A tibble: 10 x 1
    #>     col1
    #>  * <lgl>
    #>  1    NA
    #>  2    NA
    #>  3    NA
    #>  4    NA
    #>  5    NA
    #>  6    NA
    #>  7    NA
    #>  8    NA
    #>  9    NA
    #> 10    NA
    
[/code]

と，`df2` では `NA`になり，結果次のようになってしまいます．

[code]

    for (i in 2:5) {
      df1[, i] <- df1[, i] - lag(df1[, i])
    }
    df1
    #>    col1 col2 col3 col4 col5
    #> 1     1   NA   NA   NA   NA
    #> 2     2    1    1    1    1
    #> 3     3    1    1    1    1
    #> 4     4    1    1    1    1
    #> 5     5    1    1    1    1
    #> 6     6    1    1    1    1
    #> 7     7    1    1    1    1
    #> 8     8    1    1    1    1
    #> 9     9    1    1    1    1
    #> 10   10    1    1    1    1
    for (i in 2:5) {
      df2[, i] <- df2[, i] - lag(df2[, i])
    }
    df2
    #> # A tibble: 10 x 5
    #>     col1  col2  col3  col4  col5
    #>    <int> <int> <int> <int> <int>
    #>  1     1    NA    NA    NA    NA
    #>  2     2    NA    NA    NA    NA
    #>  3     3    NA    NA    NA    NA
    #>  4     4    NA    NA    NA    NA
    #>  5     5    NA    NA    NA    NA
    #>  6     6    NA    NA    NA    NA
    #>  7     7    NA    NA    NA    NA
    #>  8     8    NA    NA    NA    NA
    #>  9     9    NA    NA    NA    NA
    #> 10    10    NA    NA    NA    NA
    
[/code]

なので，`tibble` の場合は `df[[i]]`として列を取り出します．

[code]

    df2[[1]]
    #>  [1]  1  2  3  4  5  6  7  8  9 10
    lag(df2[[1]])
    #>  [1] NA  1  2  3  4  5  6  7  8  9
    
    for (i in 2:5) {
      df2[[i]] <- df2[[i]] - lag(df2[[i]])
    }
    df2
    #> # A tibble: 10 x 5
    #>     col1  col2  col3  col4  col5
    #>    <int> <int> <int> <int> <int>
    #>  1     1    NA    NA    NA    NA
    #>  2     2     1     1     1     1
    #>  3     3     1     1     1     1
    #>  4     4     1     1     1     1
    #>  5     5     1     1     1     1
    #>  6     6     1     1     1     1
    #>  7     7     1     1     1     1
    #>  8     8     1     1     1     1
    #>  9     9     1     1     1     1
    #> 10    10     1     1     1     1
    
[/code]




これは，`df` が `tibble` だからではないでしょうか．

`df1` が

[code]

    df1 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, col5 = 1:10)
    
[/code]

`df2` が

[code]

    library(dplyr)
    df2 <- data_frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, 
      col5 = 1:10)
    
[/code]

とすると，`class` は，

[code]

    class(df1)
    #> [1] "data.frame"
    class(df2)
    #> [1] "tbl_df"     "tbl"        "data.frame"
    
[/code]

です．`df[,i]` で列を取り出すと，`df1`では`vector`，`df2`では`tibble`になります．

[code]

    df1[, 1]
    #>  [1]  1  2  3  4  5  6  7  8  9 10
    df2[, 1]
    #> # A tibble: 10 x 1
    #>     col1
    #>    <int>
    #>  1     1
    #>  2     2
    #>  3     3
    #>  4     4
    #>  5     5
    #>  6     6
    #>  7     7
    #>  8     8
    #>  9     9
    #> 10    10
    
[/code]

なので，`lag()`をとると，

[code]

    lag(df1[, 1])
    #>  [1] NA  1  2  3  4  5  6  7  8  9
    lag(df2[, 1])
    #> # A tibble: 10 x 1
    #>     col1
    #>  * <lgl>
    #>  1    NA
    #>  2    NA
    #>  3    NA
    #>  4    NA
    #>  5    NA
    #>  6    NA
    #>  7    NA
    #>  8    NA
    #>  9    NA
    #> 10    NA
    
[/code]

と，`df2` では `NA`になり，結果次のようになってしまいます．

[code]

    for (i in 2:5) {
      df1[, i] <- df1[, i] - lag(df1[, i])
    }
    df1
    #>    col1 col2 col3 col4 col5
    #> 1     1   NA   NA   NA   NA
    #> 2     2    1    1    1    1
    #> 3     3    1    1    1    1
    #> 4     4    1    1    1    1
    #> 5     5    1    1    1    1
    #> 6     6    1    1    1    1
    #> 7     7    1    1    1    1
    #> 8     8    1    1    1    1
    #> 9     9    1    1    1    1
    #> 10   10    1    1    1    1
    for (i in 2:5) {
      df2[, i] <- df2[, i] - lag(df2[, i])
    }
    df2
    #> # A tibble: 10 x 5
    #>     col1  col2  col3  col4  col5
    #>    <int> <int> <int> <int> <int>
    #>  1     1    NA    NA    NA    NA
    #>  2     2    NA    NA    NA    NA
    #>  3     3    NA    NA    NA    NA
    #>  4     4    NA    NA    NA    NA
    #>  5     5    NA    NA    NA    NA
    #>  6     6    NA    NA    NA    NA
    #>  7     7    NA    NA    NA    NA
    #>  8     8    NA    NA    NA    NA
    #>  9     9    NA    NA    NA    NA
    #> 10    10    NA    NA    NA    NA
    
[/code]

なので，`tibble` の場合は `df[[i]]`として列を取り出します．

[code]

    df2[[1]]
    #>  [1]  1  2  3  4  5  6  7  8  9 10
    lag(df2[[1]])
    #>  [1] NA  1  2  3  4  5  6  7  8  9
    
    for (i in 2:5) {
      df2[[i]] <- df2[[i]] - lag(df2[[i]])
    }
    df2
    #> # A tibble: 10 x 5
    #>     col1  col2  col3  col4  col5
    #>    <int> <int> <int> <int> <int>
    #>  1     1    NA    NA    NA    NA
    #>  2     2     1     1     1     1
    #>  3     3     1     1     1     1
    #>  4     4     1     1     1     1
    #>  5     5     1     1     1     1
    #>  6     6     1     1     1     1
    #>  7     7     1     1     1     1
    #>  8     8     1     1     1     1
    #>  9     9     1     1     1     1
    #> 10    10     1     1     1     1
    
[/code]

