У меня есть data.table:
set.seed(1)
data <- data.table(time = c(1:3, 1:4),
groups = c(rep(c("b", "a"), c(3, 4))),
value = rnorm(7))
data
# groups time value
# 1: b 1 -0.6264538
# 2: b 2 0.1836433
# 3: b 3 -0.8356286
# 4: a 1 1.5952808
# 5: a 2 0.3295078
# 6: a 3 -0.8204684
# 7: a 4 0.4874291
Я хочу вычислить отстающую версию столбца "значение" на каждом уровне "групп".
Результат должен выглядеть как
# groups time value lag.value
# 1 a 1 1.5952808 NA
# 2 a 2 0.3295078 1.5952808
# 3 a 3 -0.8204684 0.3295078
# 4 a 4 0.4874291 -0.8204684
# 5 b 1 -0.6264538 NA
# 6 b 2 0.1836433 -0.6264538
# 7 b 3 -0.8356286 0.1836433
Я попытался использовать lag
напрямую:
data$lag.value <- lag(data$value)
... что явно не сработает.
Я также пробовал:
unlist(tapply(data$value, data$groups, lag))
a1 a2 a3 a4 b1 b2 b3
NA -0.1162932 0.4420753 2.1505440 NA 0.5894583 -0.2890288
Это почти то, что я хочу. Однако генерируемый вектор упорядочен по-разному, чем упорядочение в таблице данных. Это проблематично.
Каков наиболее эффективный способ сделать это в базовых R, plyr, dplyr и data.table?