如何使用data.table::shift(type='lag')按组扩展时间序列至滞后后日期
使用data.table按组扩展时间序列以覆盖滞后操作的后续日期
我需要用data.table::shift对分组月度时间序列执行滞后操作,同时扩展原时间序列的日期范围,让滞后值能覆盖到原序列结束后的n个周期(比如原序列结束于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]
得到的结果:
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
期望结果
需要扩展日期到原最大日期+3个月,同时填充对应的滞后值(value列可选):
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
解决方案
通过生成完整的日期-组笛卡尔积,再结合shift的负步长实现需求:
n <- 3 # 设定滞后步数 # 1. 按组生成扩展后的完整日期序列 full_dates <- data[, .(date = seq.Date(min(date), max(date) + months(n), by = "month")), by = group] # 2. 左连接原数据,得到包含扩展日期的完整数据集(新日期的value为NA) full_data <- full_dates[data, on = .(group, date)] # 3. 按组计算滞后值:用负步长的shift实现"提前"填充,对应扩展日期的滞后值 full_data[, value.lag := shift(value, n = -n), by = group] # 可选:调整列顺序 setcolorder(full_data, c("date", "group", "value", "value.lag"))
方案说明
- 第一步生成每个组的完整日期范围,确保覆盖原序列起始到原结束+滞后步数的周期
- 左连接原数据保留原始value,扩展日期的value自动填充为NA
- 使用
shift(value, n = -n)相当于取当前行之后第n行的value,正好对应扩展日期需要的滞后值(比如2023-06的value.lag对应2023-03的value)
内容的提问来源于stack exchange,提问作者umbe1987
相关产品推荐
相关产品推荐

