Как рассчитать разницу во времени между непоследовательными строками на основе условия из другой строки в R? - PullRequest
0 голосов
/ 28 апреля 2020
time <- c('2020-04-25 00:00:12', '2020-04-25 00:01:20', '2020-04-25 00:02:40', 
          '2020-04-25 00:02:48', '2020-04-25 00:02:58', '2020-04-25 00:03:15',
          '2020-04-25 00:03:45', '2020-04-25 00:04:23', '2020-04-25 00:04:45', 
          '2020-04-25 00:05:18', '2020-04-25 00:05:36', '2020-04-25 00:05:55')

id <- c('1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1')

status <- c("idle", "idle", "idle", "idle", "off", "off", "idle", "idle", "use", "use", "use", "idle" )

df <-data.frame(id, time, status)

df
   id                time status
1   1 2020-04-25 00:00:12   idle
2   1 2020-04-25 00:01:20   idle
3   1 2020-04-25 00:02:40   idle
4   1 2020-04-25 00:02:48   idle
5   1 2020-04-25 00:02:58    off
6   1 2020-04-25 00:03:15    off
7   1 2020-04-25 00:03:45   idle
8   1 2020-04-25 00:04:23   idle
9   1 2020-04-25 00:04:45    use
10  1 2020-04-25 00:05:18    use
11  1 2020-04-25 00:05:36    use
12  1 2020-04-25 00:05:55   idle

Привет, у меня есть набор данных выше, и я хотел бы рассчитать разницу во времени для каждого блока статуса. как бы ты это сделал? т.е. я хотел бы знать разницу во времени между первым «холостым» и последним «холостым» в первом блоке и так далее. другими словами, я хотел бы, чтобы разница во времени между idle [4] -idle [1], idle [8] -idle [7] et c.

есть ли способ сделать это в R

1 Ответ

2 голосов
/ 28 апреля 2020

Мы можем создавать группы для каждого блока и вычислять разницу во времени между last и first time в секундах.

library(dplyr)

df %>%
  mutate(time = as.POSIXct(time, tz = "UTC"), 
         grp = cumsum(status != 'idle')) %>%
  filter(status == 'idle') %>%
  group_by(id, grp) %>%
  summarise(diff = difftime(last(time), first(time), units = "secs")) %>%
  select(-grp)

#  id    diff    
#  <chr> <drtn>  
#1 1     156 secs
#2 1      38 secs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...