Как сохранить статус с минимальным временем в строке повторяющихся статусов - PullRequest
0 голосов
/ 03 июля 2018

Скажем, у меня есть данные о состоянии из нескольких сборок, которые сообщают о различных аварийных сигналах во время их получения:

build <- c(rep(11243, 6), rep(12640, 4))

message <- c(rep("High Temp", 2), rep("No Alarm", 2), rep("High Temp", 2), 
"Low Temp", rep("No Alarm", 2), "High Temp")

timeEntered <- c("2018-06-04 08:00:00", "2018-06-04 09:00:00", "2018-06-05 
08:00:00", "2018-06-06 08:00:00", "2018-06-06 09:00:00", "2018-06-07 08:08:00", 
"2017-05-23 12:45:00", "2017-05-23 13:00:00", "2017-05-24 12:30:00", "2017-05-24 12:45:00")

data <- data.frame(build, message, 
         timeEntered = as.POSIXct(timeEntered, format = "%Y-%m-%d %H:%M:%S"))

Выход:

build   message         timeEntered
11243 High Temp 2018-06-04 08:00:00
11243 High Temp 2018-06-04 09:00:00  
11243  No Alarm 2018-06-05 08:00:00
11243  No Alarm 2018-06-06 08:00:00
11243 High Temp 2018-06-06 09:00:00
11243 High Temp 2018-06-07 08:08:00
12640  Low Temp 2017-05-23 12:45:00
12640  No Alarm 2017-05-23 13:00:00
12640  No Alarm 2017-05-24 12:30:00
12640 High Temp 2017-05-24 12:45:00

Я рассчитываю получить минимальное время для каждого типа сообщений при сборке, сохраняя порядок получения сообщений. Например, моей конечной целью было бы иметь фрейм данных, подобный этому:

Выход:

build   message         timeEntered
11243 High Temp 2018-06-04 08:00:00
11243  No Alarm 2018-06-05 08:00:00
11243 High Temp 2018-06-06 09:00:00
12640  Low Temp 2017-05-23 12:45:00
12640  No Alarm 2017-05-23 13:00:00
12640 High Temp 2017-05-24 12:45:00

Спасибо, раньше времени ...

1 Ответ

0 голосов
/ 03 июля 2018
data%>%
   group_by(s=cumsum(lag(message,default = message[1])!=message),build,message)%>%
   summarise(timeEntered=min(timeEntered))
# A tibble: 6 x 4
# Groups:   s, build [?]
      s build message   timeEntered        
  <int> <dbl> <chr>     <dttm>             
1     0 11243 High Temp 2018-06-04 08:00:00
2     1 11243 No Alarm  2018-06-05 08:00:00
3     2 11243 High Temp 2018-06-06 09:00:00
4     3 12640 Low Temp  2017-05-23 12:45:00
5     4 12640 No Alarm  2017-05-23 13:00:00
6     5 12640 High Temp 2017-05-24 12:45:00

Использование базы R:

a=rle(data$message)
a$values=1:length(a$lengths)
aggregate(timeEntered~.,cbind(data,b=inverse.rle(a)),min)

  build   message b         timeEntered
1 11243 High Temp 1 2018-06-04 08:00:00
2 11243  No Alarm 2 2018-06-05 08:00:00
3 11243 High Temp 3 2018-06-06 09:00:00
4 12640  Low Temp 4 2017-05-23 12:45:00
5 12640  No Alarm 5 2017-05-23 13:00:00
6 12640 High Temp 6 2017-05-24 12:45:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...