首页 > 解决方案 > 计算单个日期列的持续时间(以秒为单位),而 R 中的 group_by ID

问题描述

R有没有办法按ID分组,及时识别“中断”,将其设置为0,然后计算时间差?

例如:

                ID               TIME              
                A                12/18/2019 4:45:10 AM
                A                12/18/2019 4:45:11 AM
                A                12/18/2019 9:06:59 PM               
                B                12/18/2019 4:14:13 AM
                B                12/18/2019 4:14:14 AM

有谁知道找到A持续时间的方法?请注意,这不是 difftime 问题。我在凌晨 4:45:10 执行了某项活动,然后在凌晨 4:45:11 再次执行。然后我停止了这项活动,并在晚上 9 点 06 分恢复。是否有代码可以准确地对 ID 进行分组,然后以秒为单位计算时间差,同时将时间的巨大差距设置为“0”以避免不准确的值?

这不是正确的解决方案。

                       diff<- data %>%
                       mutate(diff = difftime(as.POSIXct(Endtime, format = "%m/%d/%Y %I:%M:%S %p"), 
                       as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p"), units = "secs"))

结果:

                ID               TIME                         Duration   
                A                12/18/2019 4:45:10 AM        1 sec
                A                12/18/2019 4:45:11 AM        
                A                12/18/2019 9:06:59 PM        0 sec                    
                B                12/18/2019 4:14:13 AM        1 sec
                B                12/18/2019 4:14:14 AM

任何帮助是极大的赞赏。我会继续研究这个。谢谢

标签: rloopstimedplyr

解决方案


mdy_hms我们使用from将“TIME”转换为 Datetime 类,按“ID”分组,通过使用(指定)获取lubridate相邻元素之间“TIME”的差异来检查或“TIME”中的连续元素,使用add创建数字索引这也作为分组列来创建'TIME'元素之间的erence作为新列'Duration'difftimeunitcumsumdiff

library(dplyr)
library(lubridate)
df1 %>% 
  mutate(TIME = mdy_hms(TIME)) %>%
  group_by(ID) %>%  
  group_by(grp = cumsum(as.numeric(difftime(TIME,
     lag(TIME, default = first(TIME)), TIME, unit = 'sec')) > 1), add = TRUE) %>% 
  mutate(Duration = if(n() == 1) NA_real_ else as.numeric(c(diff(TIME), 0))) %>%
  ungroup %>%
  select(-grp)
# A tibble: 5 x 3
#  ID    TIME                Duration
#  <chr> <dttm>                 <dbl>
#1 A     2019-12-18 04:45:10        1
#2 A     2019-12-18 04:45:11        0
#3 A     2019-12-18 21:06:59       NA
#4 B     2019-12-18 04:14:13        1
#5 B     2019-12-18 04:14:14        0

数据

df1 <- structure(list(ID = c("A", "A", "A", "B", "B"), TIME = c("12/18/2019 4:45:10 AM", 
"12/18/2019 4:45:11 AM", "12/18/2019 9:06:59 PM", "12/18/2019 4:14:13 AM", 
"12/18/2019 4:14:14 AM")), class = "data.frame", row.names = c(NA, 
-5L))

推荐阅读