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

使用dplyr实现分组保留首行原始值并计算连续行时间差值的技术问询

优雅解决dplyr计算滞后差值并保留组首行原始值的问题

我来给你分享两个简洁的dplyr单语句实现,正好满足你的需求:每组id的首行保留原始time值,其余行计算当前time与上一行的差值。

方法一:使用coalesce()函数

coalesce()函数的作用是返回第一个非NA的参数值,正好可以用来处理组首行lag(time)返回NA的情况:

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(rt = coalesce(time - lag(time), time)) %>%
  ungroup()

原理:对于每组的第一行,time - lag(time)会得到NA,此时coalesce()会自动取第二个参数time的值;而其他行计算出的差值是非NA的,就直接使用这个差值。

方法二:使用row_number()判断组内首行

通过row_number() == 1精准定位每组的第一行,直接赋值原始time,其余行计算差值:

df %>%
  group_by(id) %>%
  mutate(rt = if_else(row_number() == 1, time, time - lag(time))) %>%
  ungroup()

原理:row_number()在每个分组内会生成从1开始的序号,判断序号为1时直接用原始time,否则计算滞后差值,逻辑清晰直观。

最终输出结果

两种方法都会得到如下符合预期的结果:

# A tibble: 10 × 3
     id   time    rt
   <int>  <dbl> <dbl>
 1     1  26204 26204
 2     1  46692 20488
 3     1  60268 13576
 4     1  86240 25972
 5     1  91872  5632
 6     2 291242 291242
 7     2 312311 21069
 8     2 333983 21672
 9     2 355122 21139
10     2 364841  9719

这两种方法都不需要额外的后续替换操作,完全遵循dplyr的管道式编程风格,代码更简洁且可读性强。

内容的提问来源于stack exchange,提问作者blazej

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:47:48