使用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
相关产品推荐
相关产品推荐

