You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:39:57