data.table::shift
来滞后我的时间序列。我现在想要的是扩展日期以考虑超出时间序列最大日期的转变。
例如,如果我有一个在 2023 年 5 月结束的每月时间序列,并且我滞后了 3 个月,那么我想要获得的是在 2023 年 8 月结束的平移时间序列。
让事情变得复杂的是,我必须分组进行。
让我提供一个简单的例子。
library(data.table)
dates <-
rep(seq.Date(
from = as.Date("2023-01-01"),
to = as.Date("2023-05-01"),
by = "month"
), times = 2)
groups <- c(rep("a", 5), rep("b", 5))
values <- 1:10
data <- data.table(date=dates,group=groups,value=values)
如果我这样做
data[, value.lag := shift(value, n = 3), by = group]
,我会得到这个,它仍然在 2023 年 5 月结束,这不是我想要的:
date group value value.lag
2023-01-01 a 1 NA
2023-02-01 a 2 NA
2023-03-01 a 3 NA
2023-04-01 a 4 1
2023-05-01 a 5 2
2023-01-01 b 6 NA
2023-02-01 b 7 NA
2023-03-01 b 8 NA
2023-04-01 b 9 6
2023-05-01 b 10 7
我需要的是这个(列值是可选的,我真正需要的是value.lag):
date group value value.lag
2023-01-01 a 1 NA
2023-02-01 a 2 NA
2023-03-01 a 3 NA
2023-04-01 a 4 1
2023-05-01 a 5 2
2023-06-01 a NA 3
2023-07-01 a NA 4
2023-08-01 a NA 5
2023-01-01 b 6 NA
2023-02-01 b 7 NA
2023-03-01 b 8 NA
2023-04-01 b 9 6
2023-05-01 b 10 7
2023-06-01 b NA 8
2023-07-01 b NA 9
2023-08-01 b NA 10
library(data.table)
library(lubridate)
rbind(data, data[, tail(.SD, 3) , by = group][,
c("date", "value") := list(date %m+% months(3), NA)])[,
value.lag := shift(value, n = 3), by = group][order(group, date)]
#> date group value value.lag
#> 1: 2023-01-01 a 1 NA
#> 2: 2023-02-01 a 2 NA
#> 3: 2023-03-01 a 3 NA
#> 4: 2023-04-01 a 4 1
#> 5: 2023-05-01 a 5 2
#> 6: 2023-06-01 a NA 3
#> 7: 2023-07-01 a NA 4
#> 8: 2023-08-01 a NA 5
#> 9: 2023-01-01 b 6 NA
#> 10: 2023-02-01 b 7 NA
#> 11: 2023-03-01 b 8 NA
#> 12: 2023-04-01 b 9 6
#> 13: 2023-05-01 b 10 7
#> 14: 2023-06-01 b NA 8
#> 15: 2023-07-01 b NA 9
#> 16: 2023-08-01 b NA 10
创建于 2024-01-30,使用 reprex v2.0.2