在 R 中:根据事件的 ID 对事件序列进行分组,并计算第一个和最后一个看到的事件之间的时间差

索伦

在下面的数据框中,我有可以重复的事件序列,直到生成新事件。我想使用的功能,可以帮助我选择这些类似的行后,计算之间的差异timestamp_end的的最后出现的事件timestamp_start的的第一个事件

数据框:

DF1 <- data.frame(segment_id = c(1, 1, 1, 1, 2 , 3, 4), first_event= c("a", "a", "a","a", "a", "b","c" ), second_event = c("a", "a","a","a", "b", "c", "c"), timestamp_start = c("2019-06-06 11:47:00","2019-06-06 12:59:38", "2019-06-06 13:01:03", "2019-06-06 14:47:03   ", "2019-06-06 18:47:00", "2019-06-06 22:47:00", "2019-06-07 02:47:00") , timestamp_end = c("2019-06-06 12:59:38", "2019-06-06 13:01:03", "2019-06-06 14:47:03", "2019-06-06 18:47:00", "2019-06-06 22:47:00    ", "2019-06-07 02:47:00", "2019-06-07 06:47:00"))


segment_id   first_event   second_event          timestamp_start            timestamp_end

  1            a              a                2019-06-06 11:47:00        2019-06-06 12:59:38
  1            a              a                2019-06-06 12:59:38        2019-06-06 13:01:03
  1            a              a                2019-06-06 13:01:03        2019-06-06 14:47:03
  1            a              a                2019-06-06 14:47:03        2019-06-06 18:47:00
  2            a              b                2019-06-06 18:47:00        2019-06-06 22:47:00
  3            b              c                2019-06-06 22:47:00        2019-06-07 02:47:00
  4            c              c                2019-06-07 02:47:00        2019-06-07 06:47:00

所以,我已经尝试了dplyrgroup_by()mutate()功能。但是,我不确定哪个功能可以帮助我获得持续时间。

DF2 <- DF1 %>%
   group_by(segment_id)%>%
   mutate("duration" = difftime(????) , units = 'hours')

我正在寻找的最终结果DF2应该是这样的:

>DF2
segment_id   first_event   second_event          timestamp_start            timestamp_end        duration

  1            a              a                2019-06-06 11:47:00        2019-06-06 18:47:00      7        
  2            a              b                2019-06-06 18:47:00        2019-06-06 22:47:00      4
  3            b              c                2019-06-06 22:47:00        2019-06-07 02:47:00      4
  4            c              c                2019-06-07 02:47:00        2019-06-07 06:47:00      4

我很感激你在这方面的帮助。

罗纳克·沙阿

我们可以更改列timestamp_start,并timestamp_endPOSIXct键入,group_by segment_idfirst_eventsecond_event,获得first timestamp_startlast timestamp_end并计算它们之间的时间之差。

library(dplyr)

DF1 %>%
  mutate_at(vars(starts_with('timestamp')), as.POSIXct) %>%
  group_by(segment_id, first_event, second_event) %>%
  summarise(timestamp_start = first(timestamp_start), 
            timestamp_end = last(timestamp_end),
            duration = as.numeric(difftime(timestamp_end, 
                      timestamp_start, units = "hours")))

#     segment_id first_event second_event timestamp_start     timestamp_end       duration
#       <dbl> <fct>       <fct>        <dttm>              <dttm>                 <dbl>
#1          1 a           a            2019-06-06 11:47:00 2019-06-06 18:47:00        7
#2          2 a           b            2019-06-06 18:47:00 2019-06-06 22:47:00        4
#3          3 b           c            2019-06-06 22:47:00 2019-06-07 02:47:00        4
#4          4 c           c            2019-06-07 02:47:00 2019-06-07 06:47:00        4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章