как преобразовать временные коды в коды поворота с помощью dplyr, если фрейм данных включает более одного события на код - PullRequest
0 голосов
/ 25 мая 2020

Я хочу преобразовать временные коды, подобные этим

library(lubridate)
library(tidyverse)

df_time <- tibble(time = c(ymd_hms("2020_01_01 00:00:01"),
                           ymd_hms("2020_01_01 00:00:02"),
                           ymd_hms("2020_01_01 00:00:03"),
                           ymd_hms("2020_01_01 00:00:04"),
                           ymd_hms("2020_01_01 00:00:05"),
                           ymd_hms("2020_01_01 00:00:06"),
                           ymd_hms("2020_01_01 00:00:07"),
                           ymd_hms("2020_01_01 00:00:08"),
                           ymd_hms("2020_01_01 00:00:09"),
                           ymd_hms("2020_01_01 00:00:10")),
                  a = c(0, 1, 1, 1, 1, 0, 0, 1, 1, 0),
                  b = c(0, 0, 1, 1, 0, 1, 1, 1, 0, 0))

, что приведет к

> df_time
# A tibble: 10 x 3
   time                    a     b
   <dttm>              <dbl> <dbl>
 1 2020-01-01 00:00:01     0     0
 2 2020-01-01 00:00:02     1     0
 3 2020-01-01 00:00:03     1     1
 4 2020-01-01 00:00:04     1     1
 5 2020-01-01 00:00:05     1     0
 6 2020-01-01 00:00:06     0     1
 7 2020-01-01 00:00:07     0     1
 8 2020-01-01 00:00:08     1     1
 9 2020-01-01 00:00:09     1     0
10 2020-01-01 00:00:10     0     0

в коды поворота (также известные как коды событий / «данные начала и остановки»). Должен выглядеть следующим образом df:

df_turn <- tibble(start = c(ymd_hms("2020_01_01 00:00:02"),
                            ymd_hms("2020_01_01 00:00:03"),
                            ymd_hms("2020_01_01 00:00:06"),
                            ymd_hms("2020_01_01 00:00:08")),
                  end = c(ymd_hms("2020_01_01 00:00:05"),
                          ymd_hms("2020_01_01 00:00:04"),
                          ymd_hms("2020_01_01 00:00:08"),
                          ymd_hms("2020_01_01 00:00:09")),
                  code = c("a", "b", "b", "a"))

> df_turn
# A tibble: 4 x 3
  start               end                 code 
  <dttm>              <dttm>              <chr>
1 2020-01-01 00:00:02 2020-01-01 00:00:05 a    
2 2020-01-01 00:00:03 2020-01-01 00:00:04 b    
3 2020-01-01 00:00:06 2020-01-01 00:00:08 b    
4 2020-01-01 00:00:08 2020-01-01 00:00:09 a  

Этот замечательный пост как преобразовать временные коды в коды поворота предлагает решение для одного события на код, но не более одного.

Спасибо!


1 Ответ

1 голос
/ 25 мая 2020

Предложу это решение по ссылке на аналогичную задачу

df_time %>% 
  pivot_longer(-time) %>% 
  group_by(name) %>% 
  mutate(tmp = value - lag(value)) %>% 
  filter(value == 1) %>% 
  mutate(tmp = cumsum(tmp)) %>% 
  group_by(name, tmp) %>% 
  summarise(start = range(time)[1],
            end = range(time)[2])


# A tibble: 4 x 4
# Groups:   name [2]
  name    tmp start               end                
  <chr> <dbl> <dttm>              <dttm>             
1 a         1 2020-01-01 00:00:02 2020-01-01 00:00:05
2 a         2 2020-01-01 00:00:08 2020-01-01 00:00:09
3 b         1 2020-01-01 00:00:03 2020-01-01 00:00:04
4 b         2 2020-01-01 00:00:06 2020-01-01 00:00:08
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...