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") )
接下来咱们一步步实现需求:
- 把字符型的Time转成时间格式:只有转成
POSIXct格式,才能计算时间差 - 按First和Second分组:毕竟只有同一First+Second组合的行,才需要对比时间
- 生成分组标识:判断当前行和下一行的时间差是否小于5分钟,把连续满足条件的行归为同一组
- 统计每组的次数:按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
相关产品推荐
相关产品推荐

