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