data.table::shift type="lag" 允许扩展数据

问题描述 投票:0回答:1

我正在使用

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
r dataframe date time-series data.table
1个回答
0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.