使用dplyr生成同组变量滞后列及其他组滞后列的技术问题
用dplyr生成同组与其他组的滞后值
我先把你的示例数据补全(新增了数值列value,这样滞后操作更有实际意义),同时先按日期排好序,解决你之前提到的顺序混乱问题:
library(tidyverse) set.seed(2) df <- data.frame( date = sample(seq(as.Date('2000/01/01'), as.Date('2015/01/01'), by="day"), 10), group = sample(c("A","B"),10,replace = T), value = rnorm(10) # 新增数值列用于演示滞后操作 ) %>% arrange(date) # 先按日期升序排序,保证时序逻辑正确
接下来分两步实现你的需求:
1. 生成同组的滞后值
这个操作很直接,先按group分组,再用lag()函数就能拿到本组内的前一个值:
df <- df %>% group_by(group) %>% mutate(lag_same_group = lag(value)) %>% ungroup()
2. 生成其他组的滞后值
这里需要一点小技巧,我们可以先把数据转成宽格式,方便提取另一组的滞后值,再转回长格式匹配对应行:
# 转成宽格式,每个日期下同时保留A、B组的value和它们的滞后值 wide_df <- df %>% pivot_wider( id_cols = date, names_from = group, values_from = c(value, lag_same_group), names_glue = "{group}_{.value}" ) # 连接宽格式数据与原数据,通过case_when匹配对应组的其他组滞后值 final_df <- df %>% left_join(wide_df, by = "date") %>% mutate( lag_other_group = case_when( group == "A" ~ B_lag_same_group, # A组行取B组的滞后值 group == "B" ~ A_lag_same_group # B组行取A组的滞后值 ) ) %>% # 清理中间生成的冗余列 select(date, group, value, lag_same_group, lag_other_group)
现在查看final_df就能看到:
lag_same_group:当前行所在组的前一个时序值lag_other_group:另一组在对应日期的滞后值(如果该日期另一组没有数据,会显示NA,符合时序逻辑)
内容的提问来源于stack exchange,提问作者Marcel Schliebs
相关产品推荐
相关产品推荐

