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
来更新我的技能,所以请注意有些事情可能不是很有效或很地道。无论如何,以下是工作流程:
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