使用dplyr根据开始和结束日期生成新变量。

4

我需要帮助。我有一些类似于这样的数据。

   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或其他名称,如果只有一种服务类型处于活动状态,则该变量为AABB,如果AABB都重叠,则为CC。例如:

   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

我一直在使用dplyrlubridate,但我不太确定如何执行这个任务,需要帮助。

ps. 在这种情况下,NA可以被视为机器永远运行该服务。


1
有12个独特的“Start”值,但您的输出只有8行。您是如何进行筛选的?同样地,您是如何确定输出的“日期”值的? - r2evans
2
在这里创建新变量的条件不清楚,应该如何设置“Maintenance”? - Chamkrai
抱歉让你感到困惑。条件是如果 ServiceTypeAA,则将 Maintenance 设置为 AA。如果 ServiceTypeBB,则将 Maintenance 设为 BB。现在,考虑到这两种服务类型可能重叠的日期,即 AA和BB,那么 Maintenance 将被设置为 CC。此外,关于 Date 输出类型,我不确定如何在 R 中正确处理日期。只有一个时间变量会在以后的绘图/总结中有所帮助。 - Puckz
第5行和第7行重叠,但为什么它不是CC? - Maël
1个回答

4

你的问题存在一些不一致之处(某些变量可能会重叠,但在期望输出中它们被视为分开的),下面提供了一种按照重叠值分组并获得部分期望输出的方法。此解决方案使用 ivstidyverselubridate 库:

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
")

谢谢。我没有得到你发布的确切输出,但是我的期望输出也不够好。我会再调整一下,希望能让它正常运行。再次感谢您的帮助! - Puckz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接