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

R语言:同列相邻行时间差对比与统计新dataframe实现方法

解决相邻行时间差分组统计问题

首先咱们先把你的原始数据重现出来,方便后续操作:

x <- data.frame(
  Time = c("2017-09-01 09:21:03","2018-05-05 05:58:59","2018-01-01 12:06:46", 
           "2017-09-01 09:23:11","2018-01-01 12:20:12","2018-05-05 05:55:50"),
  First = c("X1","X2","X3","X1","X3","X2"),
  Second = c("A1","A2","B3","A1","B3","C4")
)

接下来咱们一步步实现需求:

  1. 把字符型的Time转成时间格式:只有转成POSIXct格式,才能计算时间差
  2. 按First和Second分组:毕竟只有同一First+Second组合的行,才需要对比时间
  3. 生成分组标识:判断当前行和下一行的时间差是否小于5分钟,把连续满足条件的行归为同一组
  4. 统计每组的次数:按First、Second和分组标识统计数量,最后整理成目标格式

完整代码如下,每一步都加了注释:

library(dplyr)
library(lubridate) # 处理时间更方便

result <- x %>%
  # 1. 转换时间格式
  mutate(Time = ymd_hms(Time)) %>%
  # 2. 按First和Second分组,只在同组内对比时间
  group_by(First, Second) %>%
  # 3. 计算当前行与下一行的时间差,判断是否小于5分钟,生成分组ID
  mutate(
    # 计算时间差,单位是分钟,lead(Time)取下一行的Time
    time_diff = as.duration(lead(Time) - Time) / dminutes(1),
    # 如果时间差小于5分钟,标记为同一组;否则开启新组
    group_id = cumsum(is.na(time_diff) | time_diff >= 5)
  ) %>%
  # 4. 按First、Second、group_id分组统计次数
  group_by(First, Second, group_id) %>%
  summarise(n = n(), .groups = "drop") %>%
  # 去掉不需要的group_id列
  select(-group_id)

# 查看结果
print(result)

运行后你会得到想要的输出:

First Second     n
  <chr> <chr>  <int>
1 X1    A1         2
2 X2    A2         1
3 X2    C4         1
4 X3    B3         1
5 X3    B3         1

刚好和你想要的结果一致:X1&A1的两行时间差2分08秒,小于5分钟,所以归为一组统计次数2;X3&B3的两行时间差13分26秒,超过5分钟,所以分成两个单独的组,各统计1次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:54