如何在R中基于时间顺序的时间差对观测值进行分组
R语言按相邻观测时间间隔分组实现方案
你已经完成了滞后时间差的计算,只需要通过逻辑判断的累积和即可生成分组标识,以下是两种常用实现方式:
基础R实现
# 逻辑判断:相邻时间差≥2小时则触发新分组,第一行默认是分组起点 new_group_flag <- !is.na(data$time_diff) & data$time_diff >= 2 # 累积求和生成数字分组,转成A/B/C类字母标识 data$group <- LETTERS[cumsum(new_group_flag) + 1]
tidyverse/dplyr实现
library(dplyr) data <- data %>% mutate( lag = lag(date), time_diff = as.numeric(difftime(date, lag, units = "hours")), # coalesce将第一行的NA替换为TRUE,标记为分组起点 group = cumsum(coalesce(time_diff >= 2, TRUE)), # 数字转字母标识,不需要字母可删除本行 group = LETTERS[group] )
实现原理
- 我们先标记所有需要开启新分组的行:第一行、与上一行时间差≥2小时的行
cumsum()函数会对逻辑值累计求和,逻辑值TRUE等价于1,FALSE等价于0,每遇到一个新分组起点,分组编号就+1,最终连续间隔小于2小时的观测会被分配到同一个分组编号- 调用内置的
LETTERS常量即可将数字分组转为你示例中的A/B/C/D/E字母分组。
运行上述代码后得到的结果和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者Soren
相关产品推荐
相关产品推荐

