首页 > 解决方案 > 有没有办法在单个日期时间列中查找时差,按 ID 分组?

问题描述

我有以下数据集:

                              ID      DATE
                               A      12/18/2019 1:26:07 AM
                               A      12/18/2019 1:26:30 AM
                               A      12/18/2019 1:26:31 AM
                               A      12/18/2019 1:26:32 AM
                               A      12/18/2019 1:26:33 AM
                               A      12/18/2019 1:26:34 AM
                               A      12/18/2019 1:26:34 AM
                               B      12/18/2019 1:26:37 AM
                               B      12/18/2019 1:26:38 AM

期望的结果:

                                 Duration of A 27 secs
                                 Duration of B  1 secs

我希望准确地按 ID 分组并准确地找到持续时间。我尝试将日期时间拆分为开始时间和结束时间,但这并没有产生正确的结果。我不确定是否应该创建一个循环?

到目前为止,我已经输入了这个命令,但没有得到正确的结果:

        diff<-data %>% 
             mutate (Date = as.POSIXct(Date, format = "%m/%d/%Y %I:%M:%S %p")) %>%
             group_by(ID) %>% 
             summarise(timediff = difftime(first(DATE), last(DATE))

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

标签: rtimedplyr

解决方案


为了difftime工作,您需要以相反的顺序进行参数。

library(dplyr)
data %>% 
  mutate(DATE = lubridate::mdy_hms(DATE)) %>%
  group_by(ID) %>% 
  summarise(timediff = difftime(last(DATE), first(DATE)))

#  ID    timediff
#  <fct> <drtn>  
#1 A     27 secs 
#2 B      1 secs 

这也可以在基础 R 中完成:

data$DATE <- as.POSIXct(data$DATE, format = "%m/%d/%Y %I:%M:%S %p")
aggregate(DATE~ID, data, function(x) difftime(x[length(x)], x[1L]))

数据

data <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L), .Label = c("A", "B"), class = "factor"), DATE = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 6L, 7L, 8L), .Label = c("12/18/2019 1:26:07 AM", 
"12/18/2019 1:26:30 AM", "12/18/2019 1:26:31 AM", "12/18/2019 1:26:32 AM", 
"12/18/2019 1:26:33 AM", "12/18/2019 1:26:34 AM", "12/18/2019 1:26:37 AM", 
"12/18/2019 1:26:38 AM"), class = "factor")), class = "data.frame", 
row.names = c(NA,-9L))

推荐阅读