根据日期时间参考选择值

问题描述 投票:0回答:1

我目前正在处理两个数据集,一个包含纺织行业机器维修的记录,另一个数据集包含机器接受的预防性维护的记录。

机器 修复_日期
X 2021 年 6 月 3 日
2021年2月24日
F 2021年2月28日
O 2021年2月27日
O 2021年2月18日
O 2021年2月12日
2021 年 7 月 2 日
2021 年 8 月 1 日
2021 年 2 月 1 日
H 2021 年 1 月 2 日
H 2021 年 4 月 2 日
H 2021年3月12日
H 2021年3月22日

第二个数据库看起来像这样

机器 维护_日期
X 2021 年 4 月 3 日
F 2021年2月29日
M 2021年2月26日
L 2021年2月25日
2021年2月16日
H 2021年2月10日
H 2021 年 5 月 2 日
H 2021 年 6 月 1 日

我想要实现的是创建一个数据框,我可以在其中看到每个机器维修的日期是什么时候是最后一次维护日期之前特定维修(也希望使用tidyverse,因为我正在学习,但如果这可以使用 tidyverse 无法解决,这不是问题)。

例如:

MACHINE REPAIR_DATE LAST_MAINTENANCE_DATE_PRIOR_TO_REPAIR
F       28/02/2021           N.A

这是因为我们有机器 F 的维修记录,该记录是在维修日期之后执行的,并且我们正在查找维修日期之前的最新维修日期。

我在做什么?

我考虑过按时间顺序排列这两个数据集,然后再加入它们,然后按机器和维修日期进行分组,但我正在努力调整最新的维护日期应该在维修日期之前,并且我必须使用以下内容构建一个数据框所有机器的维修日期及其各自的最新维护日期。在连接表时我也有一些困惑,因为会有一些 N。就好像我通过“虚拟变量”进行完全连接,或者即使只是连接两个数据集,也可以说通过做类似的事情<-c(dataset1,dataset2).

代码:

ds1<-tribble(
  ~MACHINE,  ~REPAIR_DATE,
  "X",  "6/03/2021",
  "Y",  "24/02/2021",
  "F",  "28/02/2021",
  "O",  "27/02/2021",
  "O",  "18/02/2021",
  "O",  "12/02/2021",
  "U",  "7/02/2021",
  "U",  "8/01/2021",
  "U",  "2/01/2021",
  "H",  "1/02/2021",
  "H",  "4/02/2021",
  "H",  "12/03/2021",
  "H",  "22/03/2021")

ds2<-tribble(
  ~MACHINE,  ~MAINTENANCE_DATE,
  "X",  "4/03/2021",
  "F",  "29/02/2021",
  "M",  "26/02/2021",
  "L",  "25/02/2021",
  "U",  "16/02/2021",
  "H",  "10/02/2021",
  "H",  "5/02/2021",
  "H",  "6/01/2021")
r date datetime conditional-statements filtering
1个回答
1
投票

您可以尝试以下方法:

library(dplyr)
library(lubridate)

ds1 %>%
  mutate(REPAIR_DATE = dmy(REPAIR_DATE)) %>%
  left_join(ds2 %>% 
              mutate(MAINTENANCE_DATE = dmy(MAINTENANCE_DATE)), 
            by = 'MACHINE') %>% 
  group_by(MACHINE, REPAIR_DATE) %>%
  summarise(LAST_MAINTENANCE_DATE = {
      val <- REPAIR_DATE - MAINTENANCE_DATE
      if(any(val > 0, na.rm = TRUE)) 
        max(MAINTENANCE_DATE[val > 0], na.rm = TRUE)
      else NA
    }
    ) %>%
  ungroup

#  MACHINE REPAIR_DATE LAST_MAINTENANCE_DATE
#   <chr>   <date>      <date>               
# 1 F       2021-02-28  NA                   
# 2 H       2021-02-01  2021-01-06           
# 3 H       2021-02-04  2021-01-06           
# 4 H       2021-03-12  2021-02-10           
# 5 H       2021-03-22  2021-02-10           
# 6 O       2021-02-12  NA                   
# 7 O       2021-02-18  NA                   
# 8 O       2021-02-27  NA                   
# 9 U       2021-01-02  NA                   
#10 U       2021-01-08  NA                   
#11 U       2021-02-07  NA                   
#12 X       2021-03-06  2021-03-04           
#13 Y       2021-02-24  NA                   

连接两个数据集,并为

REPAIR_DATE
中每个唯一的
MACHINE
找到最后一个
MAINTENANCE_DATE

© www.soinside.com 2019 - 2024. All rights reserved.