質問: df[,i] -lag(df[,i])) } for (i in 2:20000){df[1,i] <- df[2,i]} ``` **追記** 先頭行のNAをその次の行の値で埋めるとはこういう感じです。 投稿を利用させていただきました。 ``` 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 ``` **追記2** ``` for(i in 2:20000){ df[,i] <- df[,i] - lag(df[,i]) } ``` を実行するとエラーは出ませんが2:20000列目がすべてNAになってしまいます。 また、エラーは ``` Error: unexpected '=' in: "for(i in 2:20000){ df <- df %>% mutate(df[,i] =" ``` でした。
回答: そちらのブログを書いている者です。読んでいただいてありがとうございます。 > > 1. 新しい列を作りたくないのですが、その場合 > > > はい、それで大丈夫です。 > > 2.先頭行のNAをその次の行の値で埋めたいのですが > > 列名が非常に複雑で、番地を指定してループを回す方法で行きたいのですがうまくいきません。 > > > ちょっとデータの形がよくわからないのですが、こういう感じでしょうか? 質問文のコードでどういうエラーが出たのかも書いていただけるとありがたいです。 ``` 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 ``` 追記: ``` for(i in 2:20000){ df <- df %>% mutate(df[,i] = df[,i] -lag(df[,i])) } ``` の部分でエラーが出ているとのことでしたが、こういう感じでやるなら`mutate()`ではなく直接代入すればいいかと思います。 ``` for(i in 2:20000){ # lag()にはベクトルを渡す必要があるので[[i]]で取り出す # 通常のdata.frameなら[,i]でも大丈夫 df[,i] <- df[[i]] - lag(df[[i]]) } ``` あるいは、もうすこし高度なやり方としては、`mutate_at()`、`mutate_all()`、`mutate_if()`といった関数を使えば複数の列を一気に処理できます。 ``` df %>% mutate_at(2:20000, funs(. - lag(.))) ``` このあたりの使い方については、もしご興味があれば以下のスライドをご参照ください。