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

如何在R中按ID分组计算x的滞后差值?

如何在R中按ID分组计算x的滞后差值?

刚好遇到过类似的需求,用dplyr可以轻松实现,我来给你一步步说明:

首先先确认你的原始数据构造没问题:

df <- data.frame(id = c("1", "1", "1", "2", "2"),
                 x = c(12, 20, 24, 10, 14))

核心思路就是按id分组,在每个分组内计算x的当前值与前一个值的差值,同时保留每组第一行的原始x值。用dplyr可以这样写:

library(dplyr)

# 处理数据
df_result <- df %>%
  group_by(id) %>%  # 按id分组,确保差值只在同组内计算
  mutate(x = coalesce(x - lag(x), x)) %>%  # 计算滞后差,用coalesce替换第一行的NA为原始值
  ungroup()  # 取消分组,回到普通数据框

# 查看结果
print(df_result)

运行这段代码后,你会得到预期的结果:

# A tibble: 5 × 2
  id        x
  <chr> <dbl>
1 1        12
2 1         8
3 1         4
4 2        10
5 2         4

简单解释下关键部分:

  • group_by(id):这一步是核心,确保我们只在同一个id的范围内计算差值,不会跨id干扰
  • coalesce(x - lag(x), x):lag(x)会把x列向下偏移一位,所以每组的第一个位置会得到NA;coalesce函数会依次取第一个非NA的值,所以第一行会保留原始的x,后面的行则是当前x减去前一行的x的差值
  • ungroup():可选但推荐,处理完分组操作后取消分组,避免后续操作出现意外的分组影响

如果你不习惯用coalesce,也可以用case_when来实现相同效果,代码会更直白一点:

df_result <- df %>%
  group_by(id) %>%
  mutate(x = case_when(
    row_number() == 1 ~ x,  # 第一行保留原始值
    TRUE ~ x - lag(x)       # 其他行计算滞后差
  )) %>%
  ungroup()

两种写法都能得到你想要的结果,选你觉得更易读的就行~

备注:内容来源于stack exchange,提问作者aerw4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:13:06