【问题标题】:Group, take duration and set condition within R (dplyr, r)在 R (dplyr, r) 内分组、占用持续时间和设置条件
【发布时间】:2023-04-06 16:38:01
【问题描述】:

我有一个数据集,df:(数据集包含超过 4000 行)

  DATEB

  9/9/2019 7:51:58 PM
  9/9/2019 7:51:59 PM
  9/9/2019 7:51:59 PM
  9/9/2019 7:52:00 PM
  9/9/2019 7:52:01 PM
  9/9/2019 7:52:01 PM
  9/9/2019 7:52:02 PM
  9/9/2019 7:52:03 PM
  9/9/2019 7:54:00 PM
  9/9/2019 7:54:02 PM
  9/10/2019 8:00:00PM

如果日期-时间之间的时间超过 120 秒,我想将它们放在不同的组中,并记录持续时间。

期望的输出:

Group   Duration

 a       5 sec
 b       2 sec
 c       0 sec




 dput:


  structure(list(DATEB = structure(c(2L, 3L, 3L, 4L, 5L, 5L, 6L, 
  7L, 8L, 9L, 1L), .Label = c("      9/10/2019 8:00:00 PM", "      9/9/2019 7:51:58 PM", 
  "      9/9/2019 7:51:59 PM", "      9/9/2019 7:52:00 PM", "      9/9/2019 7:52:01 PM", 
  "      9/9/2019 7:52:02 PM", "      9/9/2019 7:52:03 PM", "      9/9/2019 7:54:00 PM", 
  "      9/9/2019 7:54:02 PM"), class = "factor")), class = "data.frame", row.names = c(NA, 
  -11L))

我已经尝试了下面的代码,效果很好,除了我希望 7:51:59 和 7:52:00 在同一个组中。持续时间应该中断并创建新组的唯一时间是日期时间之间的时间超过 120 秒。

   df %>%
   mutate(DATEB = lubridate::mdy_hms(DATEB), 
   temp = floor_date(DATEB, "120 secs")) %>%
   group_by(temp) %>%
   summarise(duration = difftime(max(DATEB), min(DATEB), units = "secs"))

欢迎提出任何建议。

【问题讨论】:

  • 您是否正在寻找比 后续 个日期时间之间的给定阈值更长的 间隙暂停?您的话“日期时间之间的时间超过 120 秒”确实表明了这一点。
  • 我的意思是如果前几行之间的时间长于给定的时间段,我希望创建一个新组及其持续时间。

标签: r dplyr lubridate


【解决方案1】:

我们可以在这里使用cut

library(dplyr)
df %>%
  mutate(DATEB = lubridate::mdy_hms(DATEB), 
        temp = cut(DATEB, breaks = "2 mins")) %>%
  group_by(temp) %>%
  summarise(duration = difftime(max(DATEB), min(DATEB), units = "secs"))

# A tibble: 3 x 2
#  temp                duration
#  <fct>               <drtn>  
#1 2019-09-09 19:51:00 5 secs  
#2 2019-09-09 19:53:00 2 secs  
#3 2019-09-10 19:59:00 0 secs  

【讨论】:

  • 嗨@Ronak,代码似乎正在缩短时间,直到“休息”时间。对于我的大型数据集,我希望中断仅适用于日期时间值之间。如果发生这种情况: 5:59:59 6:00:00 6:03:00 6:03:01 所以休息发生在 6:00:00 和 6:03:03 之间。一旦组到达休息时间,上面的代码似乎会缩短时间。
  • 如果时间大于某个值(10sec)放在一个组中并占用其持续时间,我如何调整代码以检查日期时间中的前一行
【解决方案2】:

OP 要求:

持续时间应该中断并创建一个新组的唯一时间是 当日期时间之间的时间超过 120 秒时。

datetimes 之间的时间”这句话表明 OP 正在寻找 gappause。 (好吧,如果给我一个有序的日期时间向量并负责对数据进行分组,这就是我要寻找的东西。)

很遗憾,预期结果和接受的答案不符合这种解释。

但是,我会这样做:

gap_threshold <- 10
df %>%
  mutate(DATEB = lubridate::mdy_hms(DATEB), 
         gap = c(0, diff(DATEB))) %>% 
  group_by(grp = cumsum(gap > gap_threshold)) %>% 
  summarise(begin = min(DATEB), end = max(DATEB), duration = difftime(end, begin, units = "secs"))
# A tibble: 3 x 4
    grp begin               end                 duration
  <int> <dttm>              <dttm>              <drtn>  
1     0 2019-09-09 19:51:58 2019-09-09 19:52:03 5 secs  
2     1 2019-09-09 19:54:00 2019-09-09 19:54:02 2 secs  
3     2 2019-09-10 20:00:00 2019-09-10 20:00:00 0 secs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2022-07-24
    相关资源
    最近更新 更多