グループ内の遅延変数を取得する方法はいくつかあります。まず、データを並べ替える必要があります。これにより、各グループで時刻がそれに応じて並べ替えられます。
まず、サンプルのdata.frameを作成します。
> set.seed(13)
> dt <- data.frame(location = rep(letters[1:2], each = 4), time = rep(1:4, 2), var = rnorm(8))
> dt
location time var
1 a 1 0.5543269
2 a 2 -0.2802719
3 a 3 1.7751634
4 a 4 0.1873201
5 b 1 1.1425261
6 b 2 0.4155261
7 b 3 1.2295066
8 b 4 0.2366797
ラグ関数を定義します。
lg <- function(x)c(NA, x[1:(length(x)-1)])
次に、グループ内の変数のラグを使用して計算できますtapply
:
> unlist(tapply(dt$var, dt$location, lg))
a1 a2 a3 a4 b1 b2 b3 b4
NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066
ddply
パッケージplyrからの使用:
> ddply(dt, ~location, transform, lvar = lg(var))
location time var lvar
1 a 1 -0.1307015 NA
2 a 2 -0.6365957 -0.1307015
3 a 3 -0.6417577 -0.6365957
4 a 4 -1.5191950 -0.6417577
5 b 1 -1.6281638 NA
6 b 2 0.8748671 -1.6281638
7 b 3 -1.3343222 0.8748671
8 b 4 1.5431753 -1.3343222
data.table
パッケージdata.tableを使用したより高速なバージョン
> ddt <- data.table(dt)
> ddt[,lvar := lg(var), by = c("location")]
location time var lvar
[1,] a 1 -0.1307015 NA
[2,] a 2 -0.6365957 -0.1307015
[3,] a 3 -0.6417577 -0.6365957
[4,] a 4 -1.5191950 -0.6417577
[5,] b 1 -1.6281638 NA
[6,] b 2 0.8748671 -1.6281638
[7,] b 3 -1.3343222 0.8748671
[8,] b 4 1.5431753 -1.3343222
lag
パッケージplmの関数を使用する
> pdt <- pdata.frame(dt)
> lag(pdt$var)
a-1 a-2 a-3 a-4 b-1 b-2 b-3 b-4
NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066
lag
パッケージdplyrの関数を使用する
> dt %>% group_by(location) %>% mutate(lvar = lag(var))
Source: local data frame [8 x 4]
Groups: location
location time var lvar
1 a 1 0.5543269 NA
2 a 2 -0.2802719 0.5543269
3 a 3 1.7751634 -0.2802719
4 a 4 0.1873201 1.7751634
5 b 1 1.1425261 NA
6 b 2 0.4155261 1.1425261
7 b 3 1.2295066 0.4155261
8 b 4 0.2366797 1.2295066
最後の2つのアプローチではdata.frame
、別のオブジェクトへの変換が必要ですが、ソートについて心配する必要はありません。私の個人的な好みは最後のもので、最初に答えを書いたときには利用できませんでした。
更新: data.tableコードを変更して、@ Hibernatingが指摘するdata.tableパッケージの開発を反映しました。
更新2:dplyrの例を追加しました。