根据 dplyr 中的开始和停止日期生成新变量
Generate new variable based on start and stop date in dplyr
我需要帮助。我有一些看起来与此类似的数据。
Machine Start Stop ServiceType
1 XX 2014-12-04 <NA> AA
2 XX 2013-09-05 2013-11-05 BB
3 XX 2013-11-21 2014-09-25 BB
4 XX 2013-10-11 2014-11-18 BB
5 XX 2021-12-03 <NA> AA
6 XX 2020-08-06 2022-09-15 AA
7 XX 2021-06-10 <NA> BB
8 YY 2020-01-17 <NA> BB
9 YY 2015-11-04 2018-04-30 BB
10 YY 2016-05-28 2019-03-21 BB
11 YY 2019-09-27 <NA> BB
12 YY 2018-01-05 <NA> AA
所以我想做的是生成一个新变量,比如 Maintenance 之类的,如果只有一种服务类型处于活动状态,则为 AA
或 BB
或 CC
如果AA
和 BB
重叠。喜欢,
Machine Date Maintenance
1 XX 2013-09-05 BB
2 XX 2013-11-21 BB
3 XX 2013-10-11 AA
4 XX 2014-12-04 CC
5 XX 2021-12-03 AA
6 YY 2015-11-04 BB
7 YY 2016-05-28 CC
8 YY 2020-01-17 BB
我一直在与 dplyr
和 lubridate
合作,但我有点不确定如何执行此任务,如有任何帮助将不胜感激。
ps。 NA
在这种情况下可以被认为是一台机器永远在该服务上。
您的问题存在一些不一致之处(有些变量确实重叠,但它们在您的预期输出中被认为是分开的),这是一种按重叠值分组并获得您预期输出的方法。此解决方案使用 ivs
、tidyverse
和 lubridate
库:
library(ivs)
library(tidyverse)
library(lubridate)
df %>%
mutate(Stop = ifelse(Stop == "<NA>", Start, Stop),
across(c(Start, Stop), ymd),
Stop = if_else(Stop == Start, Stop + days(1), Stop),
ivs = iv(Start, Stop)) %>%
group_by(Machine, gp = iv_identify_group(ivs)) %>%
summarise(ServiceType = toString(unique(ServiceType)),) %>%
ungroup() %>%
mutate(gp = iv_start(gp),
ServiceType = ifelse(ServiceType %in% c("BB, AA", "AA, BB"), "CC", ServiceType))
# A tibble: 6 × 3
gp Machine ServiceType
<date> <chr> <chr>
1 2013-09-05 XX BB
2 2014-12-04 XX AA
3 2020-08-06 XX CC
4 2015-11-04 YY CC
5 2019-09-27 YY BB
6 2020-01-17 YY BB
数据
df <- read.table(header = T, text = " Machine Start Stop ServiceType
1 XX 2014-12-04 NA AA
2 XX 2013-09-05 2013-11-05 BB
3 XX 2013-11-21 2014-09-25 BB
4 XX 2013-10-11 2014-11-18 BB
5 XX 2021-12-03 <NA> AA
6 XX 2020-08-06 2022-09-15 AA
7 XX 2021-06-10 <NA> BB
8 YY 2020-01-17 <NA> BB
9 YY 2015-11-04 2018-04-30 BB
10 YY 2016-05-28 2019-03-21 BB
11 YY 2019-09-27 <NA> BB
12 YY 2018-01-05 <NA> AA
")
我需要帮助。我有一些看起来与此类似的数据。
Machine Start Stop ServiceType
1 XX 2014-12-04 <NA> AA
2 XX 2013-09-05 2013-11-05 BB
3 XX 2013-11-21 2014-09-25 BB
4 XX 2013-10-11 2014-11-18 BB
5 XX 2021-12-03 <NA> AA
6 XX 2020-08-06 2022-09-15 AA
7 XX 2021-06-10 <NA> BB
8 YY 2020-01-17 <NA> BB
9 YY 2015-11-04 2018-04-30 BB
10 YY 2016-05-28 2019-03-21 BB
11 YY 2019-09-27 <NA> BB
12 YY 2018-01-05 <NA> AA
所以我想做的是生成一个新变量,比如 Maintenance 之类的,如果只有一种服务类型处于活动状态,则为 AA
或 BB
或 CC
如果AA
和 BB
重叠。喜欢,
Machine Date Maintenance
1 XX 2013-09-05 BB
2 XX 2013-11-21 BB
3 XX 2013-10-11 AA
4 XX 2014-12-04 CC
5 XX 2021-12-03 AA
6 YY 2015-11-04 BB
7 YY 2016-05-28 CC
8 YY 2020-01-17 BB
我一直在与 dplyr
和 lubridate
合作,但我有点不确定如何执行此任务,如有任何帮助将不胜感激。
ps。 NA
在这种情况下可以被认为是一台机器永远在该服务上。
您的问题存在一些不一致之处(有些变量确实重叠,但它们在您的预期输出中被认为是分开的),这是一种按重叠值分组并获得您预期输出的方法。此解决方案使用 ivs
、tidyverse
和 lubridate
库:
library(ivs)
library(tidyverse)
library(lubridate)
df %>%
mutate(Stop = ifelse(Stop == "<NA>", Start, Stop),
across(c(Start, Stop), ymd),
Stop = if_else(Stop == Start, Stop + days(1), Stop),
ivs = iv(Start, Stop)) %>%
group_by(Machine, gp = iv_identify_group(ivs)) %>%
summarise(ServiceType = toString(unique(ServiceType)),) %>%
ungroup() %>%
mutate(gp = iv_start(gp),
ServiceType = ifelse(ServiceType %in% c("BB, AA", "AA, BB"), "CC", ServiceType))
# A tibble: 6 × 3
gp Machine ServiceType
<date> <chr> <chr>
1 2013-09-05 XX BB
2 2014-12-04 XX AA
3 2020-08-06 XX CC
4 2015-11-04 YY CC
5 2019-09-27 YY BB
6 2020-01-17 YY BB
数据
df <- read.table(header = T, text = " Machine Start Stop ServiceType
1 XX 2014-12-04 NA AA
2 XX 2013-09-05 2013-11-05 BB
3 XX 2013-11-21 2014-09-25 BB
4 XX 2013-10-11 2014-11-18 BB
5 XX 2021-12-03 <NA> AA
6 XX 2020-08-06 2022-09-15 AA
7 XX 2021-06-10 <NA> BB
8 YY 2020-01-17 <NA> BB
9 YY 2015-11-04 2018-04-30 BB
10 YY 2016-05-28 2019-03-21 BB
11 YY 2019-09-27 <NA> BB
12 YY 2018-01-05 <NA> AA
")