36270


<http://notchained.hatenablog.com/entry/2015/04/24/223027>  
を参考にラグをとりたいのですが、解説にもあるようにやはり先頭行がNAになってしまいます。  
データフレームの2列目から20000列目までをラグをとりたいですが、2つほど気になる点があります。

  1. 新しい列を作りたくないのですが、その場合、`library(tidyverse)`のもとで
[code]     mutate(a = a - lag(a))

    
[/code]

でよろしいでしょうか。

  2. 先頭行のNAをその次の行の値で埋めたいのですが  
列名が非常に複雑で、番地を指定してループを回す方法で行きたいのですがうまくいきません。  
下のコードではエラーでした。

[code]     for(i in 2:20000){

    df <- df %>% mutate(df[,i] = df[,i] -lag(df[,i]))
    }
    
    for (i in 2:20000){df[1,i] <- df[2,i]}
    
[/code]

**追記**  
先頭行のNAをその次の行の値で埋めるとはこういう感じです。  
投稿を利用させていただきました。

[code]

    df_lag
    #>    col1 col2 col3 col4 col5
    #> 1    NA   NA   NA   NA   NA
    #> 2     6    5    4    3    2
    #> 3     1    1    1    1    1
    #> 4     1    1    1    1    1
    #> 5     1    1    1    1    1
    #> 6     1    1    1    1    1
    #> 7     1    1    1    1    1
    #> 8     1    1    1    1    1
    #> 9     1    1    1    1    1
    #> 10    1    1    1    1    1
    
    df_lag[1,] <- df_lag[2,]
    df_lag
    #>    col1 col2 col3 col4 col5
    #> 1     6    5    4    3    2
    #> 2     6    5    4    3    2
    #> 3     1    1    1    1    1
    #> 4     1    1    1    1    1
    #> 5     1    1    1    1    1
    #> 6     1    1    1    1    1
    #> 7     1    1    1    1    1
    #> 8     1    1    1    1    1
    #> 9     1    1    1    1    1
    #> 10    1    1    1    1    1
    
[/code]

**追記2**

[code]

    for(i in 2:20000){
     df[,i] <- df[,i] - lag(df[,i])
    }
    
[/code]

を実行するとエラーは出ませんが2:20000列目がすべてNAになってしまいます。

また、エラーは

[code]

    Error: unexpected '=' in:
    "for(i in 2:20000){
    df <- df %>% mutate(df[,i] ="
    
[/code]

でした。


CC BY-SA 3.0
2017-07-10T15:53:51.383
36256
2017-07-14T05:40:20.390
2017-07-14T01:42:32.457
19110
12457
question
r tidyverse
時系列データでラグを取った場合のNAへの対処


そちらのブログを書いている者です。読んでいただいてありがとうございます。

>   1. 新しい列を作りたくないのですが、その場合
>

はい、それで大丈夫です。

> 2．先頭行のNAをその次の行の値で埋めたいのですが  
>  列名が非常に複雑で、番地を指定してループを回す方法で行きたいのですがうまくいきません。

ちょっとデータの形がよくわからないのですが、こういう感じでしょうか？  
質問文のコードでどういうエラーが出たのかも書いていただけるとありがたいです。

  
  

[code]

    library(dplyr, warn.conflicts = FALSE)
    
    df <- data.frame(
      col1 = 1:10,
      col2 = 1:10,
      col3 = 1:10,
      col4 = 1:10,
      col5 = 1:10
    )
    
    df_lag <- df %>%
      mutate_all(funs(. - lag(.)))
    df_lag
    #>    col1 col2 col3 col4 col5
    #> 1    NA   NA   NA   NA   NA
    #> 2     1    1    1    1    1
    #> 3     1    1    1    1    1
    #> 4     1    1    1    1    1
    #> 5     1    1    1    1    1
    #> 6     1    1    1    1    1
    #> 7     1    1    1    1    1
    #> 8     1    1    1    1    1
    #> 9     1    1    1    1    1
    #> 10    1    1    1    1    1
    
    df_lag[1,] <- df_lag[2,]
    df_lag
    #>    col1 col2 col3 col4 col5
    #> 1     1    1    1    1    1
    #> 2     1    1    1    1    1
    #> 3     1    1    1    1    1
    #> 4     1    1    1    1    1
    #> 5     1    1    1    1    1
    #> 6     1    1    1    1    1
    #> 7     1    1    1    1    1
    #> 8     1    1    1    1    1
    #> 9     1    1    1    1    1
    #> 10    1    1    1    1    1
    
[/code]

* * *

追記：

[code]

    for(i in 2:20000){
      df <- df %>% mutate(df[,i] = df[,i] -lag(df[,i]))
    }
    
[/code]

の部分でエラーが出ているとのことでしたが、こういう感じでやるなら`mutate()`ではなく直接代入すればいいかと思います。

[code]

    for(i in 2:20000){
      # lag()にはベクトルを渡す必要があるので[[i]]で取り出す
      # 通常のdata.frameなら[,i]でも大丈夫
      df[,i] <- df[[i]] - lag(df[[i]])
    }
    
[/code]

あるいは、もうすこし高度なやり方としては、`mutate_at()`、`mutate_all()`、`mutate_if()`といった関数を使えば複数の列を一気に処理できます。

[code]

    df %>%
      mutate_at(2:20000, funs(. - lag(.)))
    
[/code]

このあたりの使い方については、もしご興味があれば以下のスライドをご参照ください。

<https://speakerdeck.com/yutannihilation/dplyrzai-ru-men-colwisebian>


CC BY-SA 3.0
2017-07-11T06:03:29.733
36270
2017-07-14T05:40:20.390
2017-07-14T05:40:20.390
2544
2544
36256
answer