質問: 時系列データでラグを取った場合のNAへの対処 で質問させていただいたものです。 df[,i]は問題ないのですがlag(df[,i])をとるとすべてNAとなってしまいます。 そのため差をとるとやはりすべてがNAになるようです。 df[,i]のclassは[1] "tbl_df" "tbl" "data.frame"でした。 この場合どのように対処すればよいでしょうか。 入っている数値が小数ばかりなのがまずいということはあるでしょうか。 よろしくお願いいたします。
回答: これは,`df` が `tibble` だからではないでしょうか. `df1` が ``` df1 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, col5 = 1:10) ``` `df2` が ``` library(dplyr) df2 <- data_frame(col1 = 1:10, col2 = 1:10, col3 = 1:10, col4 = 1:10, col5 = 1:10) ``` とすると,`class` は, ``` class(df1) #> [1] "data.frame" class(df2) #> [1] "tbl_df" "tbl" "data.frame" ``` です.`df[,i]` で列を取り出すと,`df1`では`vector`,`df2`では`tibble`になります. ``` df1[, 1] #> [1] 1 2 3 4 5 6 7 8 9 10 df2[, 1] #> # A tibble: 10 x 1 #> col1 #> #> 1 1 #> 2 2 #> 3 3 #> 4 4 #> 5 5 #> 6 6 #> 7 7 #> 8 8 #> 9 9 #> 10 10 ``` なので,`lag()`をとると, ``` lag(df1[, 1]) #> [1] NA 1 2 3 4 5 6 7 8 9 lag(df2[, 1]) #> # A tibble: 10 x 1 #> col1 #> * #> 1 NA #> 2 NA #> 3 NA #> 4 NA #> 5 NA #> 6 NA #> 7 NA #> 8 NA #> 9 NA #> 10 NA ``` と,`df2` では `NA`になり,結果次のようになってしまいます. ``` 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 #> #> 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 ``` なので,`tibble` の場合は `df[[i]]`として列を取り出します. ``` 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 #> #> 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 ```