R计算事件之间的时间差

R计算事件之间的时间差,r,time,R,Time,我有以下数据: Timestamp Tag OldValue NewValue 5/4/2015 8:45 MD_LL46001_BYP NORMAL MAN_BYP 5/7/2015 20:46 MD_LL46001_BYP MAN_BYP NORMAL 5/4/2015 2:58 MD_LL46101_BYP MAN_BYP NORMAL 5/7/2015 20:47 MD_LL47401_BYP MAN_BYP NORMAL 5/7/

我有以下数据:

Timestamp              Tag    OldValue  NewValue
5/4/2015 8:45   MD_LL46001_BYP  NORMAL  MAN_BYP
5/7/2015 20:46  MD_LL46001_BYP  MAN_BYP NORMAL
5/4/2015 2:58   MD_LL46101_BYP  MAN_BYP NORMAL
5/7/2015 20:47  MD_LL47401_BYP  MAN_BYP NORMAL
5/7/2015 20:47  MD_LL47401_BYP  NORMAL  MAN_BYP
5/7/2015 20:47  MD_LL47401_BYP  MAN_BYP NORMAL
5/11/2015 1:37  MD_LL47401_BYP  NORMAL  MAN_BYP
5/11/2015 2:04  MD_LL47401_BYP  MAN_BYP NORMAL
5/11/2015 11:03 MD_LL47401_BYP  NORMAL  MAN_BYP
5/11/2015 11:11 MD_LL47401_BYP  MAN_BYP NORMAL
5/10/2015 13:16 MD_LXL21102_BYP NORMAL  MAN_BYP
5/10/2015 19:42 MD_LXL21102_BYP MAN_BYP NORMAL
5/4/2015 11:40  MD_PL41201_BYP  NORMAL  MAN_BYP
5/4/2015 11:57  MD_PL41201_BYP  MAN_BYP NORMAL
我想计算事件之间的时间差(“从正常到man_byp的变化”和“从man_byp到正常的变化”),对于相同的标签,这可以在R中实现吗?我希望看到的输出:

Tag             Bypass put in   Duration
MD_LL46001_BYP  5/4/2015 8:45   xxx minutes
MD_LL47401_BYP  5/7/2015 20:47  xx minutes

事件和标记不一定连续放置在表中。

欢迎使用SO!我故意使用
dplyr
来更新我的技能,所以请注意有些事情可能不是很有效或很地道。无论如何,以下是工作流程:

  • 创建正确的datetime对象,对正确的状态更改进行编码
  • 删除额外的列并按标记和时间排序
  • 将描述的逻辑应用于每个标记
  • 代码如下:

    library(dplyr)
    df <- read.table("clipboard")
    names(df) <- c("date", "time", "tag", "status1", "status2")
    df$datetime <- as.POSIXct(strptime(paste(df$date, df$time), "%m/%d/%Y %H:%M"))
    df$status_change <- 
      ifelse(df$status1 == "NORMAL" & df$status2 == "MAN_BYP", 1, 
             ifelse(df$status2 == "NORMAL" & df$status1 == "MAN_BYP", 2, NA))
    df %>% 
      select(datetime, tag, status_change) %>% 
      arrange(tag, datetime) -> df2
    df2 %>% 
      group_by(tag) %>% 
      do({
        k <- nrow(.)
        res <- rep(NA, k)
        ind <- as.logical(c(0, .$status_change[-1] - .$status_change[-k]))
        dmins <- c(NA, difftime(.$datetime[-1], .$datetime[-k], units = "mins"))
        res[ind] <- dmins[ind]
        data.frame(res)
      }) %>% 
      (function(x) cbind(df2, x[, -1]))
    

    请注意,零和NA没有相同的意义。

    做得很好。我只会通过添加
    library(lubridate)
    来更改内容,然后交换
    df$datetime@ShawnMehan,谢谢。我对strtime一直很满意,但是如果你想一直使用哈德利,
    lubridate
    是一个很好的选择。
                  datetime             tag status_change  res
    1  2015-05-04 08:45:00  MD_LL46001_BYP             1   NA
    2  2015-05-07 20:46:00  MD_LL46001_BYP             2 5041
    3  2015-05-04 02:58:00  MD_LL46101_BYP             2   NA
    4  2015-05-07 20:47:00  MD_LL47401_BYP             2   NA
    5  2015-05-07 20:47:00  MD_LL47401_BYP             1    0
    6  2015-05-07 20:47:00  MD_LL47401_BYP             2    0
    7  2015-05-11 01:37:00  MD_LL47401_BYP             1 4610
    8  2015-05-11 02:04:00  MD_LL47401_BYP             2   27
    9  2015-05-11 11:03:00  MD_LL47401_BYP             1  539
    10 2015-05-11 11:11:00  MD_LL47401_BYP             2    8
    11 2015-05-10 13:16:00 MD_LXL21102_BYP             1   NA
    12 2015-05-10 19:42:00 MD_LXL21102_BYP             2  386
    13 2015-05-04 11:40:00  MD_PL41201_BYP             1   NA
    14 2015-05-04 11:57:00  MD_PL41201_BYP             2   17