我想转换这样的时间代码
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))
导致
>df_time
# A tibble: 6 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 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
谢谢!
一种方法是将你的数据帧转换为长数据,并过滤掉0。一旦你这样做了,你只需要每组的最大和最小值(如每个 time
),所以我们可以使用 slice
我们分组后。最后一步是创建一个带有 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)
从而得到
# 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