36347


[時系列データでラグを取った場合の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"でした。

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

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


CC BY-SA 3.0
2017-07-14T01:19:50.470
36337
2017-07-14T04:58:23.977
12457
question
r
lag関数の仕様について


これは，`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]


CC BY-SA 3.0
2017-07-14T04:58:23.977
36347
2017-07-14T04:58:23.977
24196
36337
answer