R 如何将时间码转换为转弯码

R 如何将时间码转换为转弯码,r,dataframe,dplyr,tidyr,lubridate,R,Dataframe,Dplyr,Tidyr,Lubridate,我想像这样转换时间代码 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"),

我想像这样转换时间代码

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")),
                  a = c(0, 1, 1, 1, 1, 0),
                  b = c(0, 0, 1, 1, 0, 0))
库(lubridate)
图书馆(tidyverse)
df_时间df_时间
#一个tibble:6x3
时间a b
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     0
转换代码(又称事件代码/“启动-停止数据”)。应如以下df所示:

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


> df_turn
# A tibble: 2 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  


df\u转向df\u转向
#一个tibble:2x3
起止码
1 2020-01-01 00:00:02 2020-01-01 00:00:05 a
2020-01-01 00:00:03 2020-01-01 00:00:04 b

谢谢

一种方法是将数据帧转换为长帧并过滤掉0。一旦您这样做,您只需要每组的最大值和最小值(根据
时间
),因此我们可以在分组后使用
切片
。最后一步是创建一个包含
start
end
的列,并简单地将生成的数据帧转换为宽格式,即

library(dplyr)
library(tidyr)

df_time %>% 
 pivot_longer(cols = -1, names_to = 'code') %>% 
 filter(value != 0) %>% 
 group_by(code) %>%
 slice(c(which.min(time), which.max(time))) %>% 
 select(-value) %>% 
 mutate(new = c('start', 'end')) %>% 
 pivot_wider(names_from = new, values_from = time)
这就给了,

#一个tible:2x3
#分组:名称[2]
代码开始和结束
1A 2020-01-01 00:00:02 2020-01-01 00:00:05
2B2020-01-01 00:00:03 2020-01-01 00:00:04
library(dplyr)
library(tidyr)

df_time %>% 
 pivot_longer(cols = -1, names_to = 'code') %>% 
 filter(value != 0) %>% 
 group_by(code) %>%
 slice(c(which.min(time), which.max(time))) %>% 
 select(-value) %>% 
 mutate(new = c('start', 'end')) %>% 
 pivot_wider(names_from = new, values_from = time)
# A tibble: 2 x 3
# Groups:   name [2]
  code   start               end                
  <chr> <dttm>              <dttm>             
1 a     2020-01-01 00:00:02 2020-01-01 00:00:05
2 b     2020-01-01 00:00:03 2020-01-01 00:00:04