複数の変数の複数のラグを作成したいので、関数を書くことが役に立ちます。私のコードが警告(「長さ1のベクトルを切捨て」)と、誤った結果スロー:debugging:複数の列(dplyr)の複数のラグを作成する関数
library(dplyr)
time <- c(2000:2009, 2000:2009)
x <- c(1:10, 10:19)
id <- c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
df <- data.frame(id, time, x)
three_lags <- function (data, column, group, ordervar) {
data <- data %>%
group_by_(group) %>%
mutate(a = lag(column, 1L, NA, order_by = ordervar),
b = lag(column, 2L, NA, order_by = ordervar),
c = lag(column, 3L, NA, order_by = ordervar))
}
df_lags <- three_lags(data=df, column=x, group=id, ordervar=time) %>%
arrange(id, time)
をもmutate_each
を使用して、よりエレガントな解決策があるかもしれません場合、私は疑問に思いましたが、私はそれはどちらか動作するように取得できませんでした。もちろん、新しい遅れた変数ごとに長いコードを書くこともできますが、Idはそれを避けるのが好きです。
EDIT:
akrunのdplyrの答えは動作しますが、大規模なデータフレームのために計算するのに長い時間がかかります。 data.table
を使用するソリューションがより効率的であるようです。そのため、dplyrや他の解決策では、いくつかの列に実装することも可能です。&いくつかのラグがまだ見つかっています。
EDIT 2:複数の列と、次のソリューションは、そのシンプルさに、私には非常に適しているようだがないグループ(例えば、「ID」)については
。コードはもちろんの短縮が、ステップステップによってすることができる:
はdf <- arrange(df, time)
df.lag <- shift(df[,1:24], n=1:3, give.names = T) ##column indexes of columns to be lagged as "[,startcol:endcol]", "n=1:3" sepcifies the number of lags (lag1, lag2 and lag3 in this case)
df.result <- bind_cols(df, df.lag)
それは完璧に動作します!私はそれを正しく操作するために 'data.table'を読んでみる必要があります。私のような人は非常に熟練したプログラマーではないと思うのですが、' dplyr'ソリューションは 'dataで更新されました – yoland
です。あなたは 'シフト'をしたい多くの列がある場合のためのテーブルの解決 – akrun