【问题标题】:Selecting a value based on a datetime reference根据日期时间参考选择值
【发布时间】:2021-07-24 21:05:40
【问题描述】:

大家好,希望大家一切都好!

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

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

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

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

我想要实现的是创建一个数据框,我可以在其中查看每个机器维修的日期,该日期是该特定维修的最后一次维护日期之前(也希望自从我学习以来就使用 tidyverse,但是如果你们认为使用 tidyverse 无法解决这个问题,那我也想向你们学习)。比如

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

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

我在做什么?

我曾考虑按时间顺序排列这两个数据集,以便稍后加入它们,然后按 MACHINE 和 REPAIR_DATE 分组,但我发现自己正在努力适应最新的维护日期应该在维修日期之前,我必须构建包含所有机器维修日期及其各自最新维护日期的数据框。在加入表格时我也有点困惑,因为会有一些 N. 就好像我通过“虚拟变量”进行完全连接,或者即使只是加入两个数据集,也可以通过执行类似 all 的操作来表示

代码:

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】:

    您可以尝试以下方法:

    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                   
    

    加入两个数据集,并为MACHINE 中的每个唯一REPAIR_DATE 找到最后一个MAINTENANCE_DATE

    【讨论】:

    • Helo @Ronak 非常感谢您的代码!这对我帮助很大。我只是一名 R 学生......如果你能帮助我理解你在代码的摘要部分做了什么,val 变量代表什么以及为什么删除 NA 很重要,我将非常感激?再次感谢你
    • val 在日期 REPAIR_DATEMAINTENANCE_DATE 之间存在差异。对于val &gt; 0,我们只保留维修日期之前发生的维护日期,并从中选择max 日期。删除NA 很重要,因为maxNA 返回NA。查看max(1, 2, NA)max(1, 2, NA, na.rm = TRUE) 之间的输出差异
    • 天啊,我忘记了一些事情,我很抱歉@RonakShah 如果在每个 REPAIR_DATE 的第一个数据集中我也有一个唯一的 repair_code 比如说 OPW_999,我怎样才能将这个唯一的修复代码添加到最终数据中设置,我尝试通过在我的数据集中按 (REPAIR_CODE, MACHINE, AND REPAIR:DATE) 分组,一些数据可能相同,最终将相同的 REPAIR_CODE 分配给错误的机器......非常感谢你帮助我我保证这将是我最后一次询问非常感谢
    • 好吧,我会对 group_byREPAIR_CODE 说同样的话,以将其保留在最终数据集中,但如果它在 summarise 中没有按预期工作,您可能需要添加 @987654339 @ 获取第一个。
    • 太棒了!非常感谢我的朋友!
    猜你喜欢
    • 2017-12-30
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多