R语言:分组滞后变量生成不同组内滞后值的技术问题问询
刚好碰到过类似的场景,我来给你分两种常见情况讲清楚怎么实现,结合你用的dplyr和data.table两种工具来写:
首先先把你的示例数据固定下来(加个随机种子让结果可重复),方便后续演示:
library(dplyr) library(data.table) library(lubridate) set.seed(123) # 固定随机数,结果可复现 v2 <- sample(1:100, 15) df <- data.frame(qy = c(rep('2016-01-01', 5), rep('2016-04-01', 5), rep('2016-10-01', 5)), id = c(rep(c('a','a','b','b','c'), 3)), value_t = c(0,0,1,1,0,1,1,0,0,0,0,0,1,1,1), value2_t = c(v2)) df$qy <- ymd(df$qy) df <- df %>% arrange(id, qy)
情况1:同一ID下全局滞后(跨季度关联)
如果你的需求是同一个ID下,所有观测按时间排序后,每一行滞后前一行(不管是不是同一个季度),可以这样做:
用dplyr实现
df_lag_global <- df %>% group_by(id) %>% mutate( # 滞后1期,无前置数据时填充NA value_t_lag1 = lag(value_t, n = 1, default = NA), # 滞后1期,无前置数据时填充0(可自定义) value2_t_lag1 = lag(value2_t, n = 1, default = 0) ) %>% ungroup()
用data.table实现
setDT(df) df[, `:=`( value_t_lag1 = shift(value_t, n = 1, type = "lag", fill = NA), value2_t_lag1 = shift(value2_t, n = 1, type = "lag", fill = 0) ), by = id]
情况2:同一ID+同季度内的组内滞后(仅同季度关联)
如果你的需求是仅在同一个ID的同一个季度内,对观测做滞后,不同季度之间不产生关联,就需要按id和qy双重分组:
用dplyr实现
df_lag_quarter <- df %>% group_by(id, qy) %>% mutate( value_t_lag_q = lag(value_t, n = 1, default = NA), value2_t_lag_q = lag(value2_t, n = 1, default = 0) ) %>% ungroup()
用data.table实现
setDT(df) df[, `:=`( value_t_lag_q = shift(value_t, n = 1, type = "lag", fill = NA), value2_t_lag_q = shift(value2_t, n = 1, type = "lag", fill = 0) ), by = .(id, qy)]
额外小提示
- 如果需要滞后多期,把
n参数改成对应数字就行,比如n=2就是滞后2期; - 填充值可以根据需求自定义,比如NA、0或者其他常量;
- 如果你的分组内观测顺序不确定,记得在分组后先加一步
arrange(你的排序变量),确保滞后的顺序是正确的。
内容的提问来源于stack exchange,提问作者kathystehl
相关产品推荐
相关产品推荐

