【问题标题】:Determine differences between date stamps and reference dates确定日期戳和参考日期之间的差异
【发布时间】:2020-11-19 09:51:35
【问题描述】:

我正在处理一个包含 191K 观察的数据集,其中包含 2014-2020 年期间带有日期戳的单个记录。

我有四个参考日期(2014 年 9 月 19 日、2016 年 9 月 9 日、2017 年 10 月 26 日、2019 年 6 月 19 日),我需要确定每条记录的日期戳之间的差异。问题是我只需要difftime 的正值:

  • 如果差值
  • 如果日期差为180-365天,则该值将设置为180;
  • 如果差值 >365 天,则不适用;
  • 不会包含负值。

样本数据:

Date            Difftime     Notes:
11 Nov 2014     53           19 Sept 2014 used as reference
10 Jun 2015     180          19 Sept 2014 reference, but >180
5 Jan 2018      71           26 Oct 2017 reference
1 May 2019      NA           No reference date within 365 days

总而言之,需要将记录的日期戳与相关参考日期(即壁橱、记录后日期)进行比较。我认为在为每个参考日期创建单独的变量之后,我可以在多个单独的 ifelse 语句中执行此操作,但我不想用更多变量使我的数据集混乱(即使我可以在评估后删除它们) .对于如何为此评估编写代码的任何见解,我将不胜感激。

【问题讨论】:

    标签: r date if-statement


    【解决方案1】:

    这是一种可能的方法。

    我创建了一个带有四个参考日期的向量(按顺序):

    ref_dates <- as.Date(c("2014-09-19", "2016-09-09", "2017-10-26", "2019-6-19"))
    

    还有一个带有样本数据的data.frame:

    sample_data <- data.frame(Date = as.Date(c("2014-11-11", "2015-6-10", "2018-1-5", "2019-5-1")))
    

    您可以使用findInterval 确定每个采样日期的最接近的参考日期,而无需重复(“价格合适”的方法):

    编辑:我创建了一个函数来返回最接近的日期(或 NA,如果它早于所有参考日期):

    my_fun <- function(x) {
      the_date <- ref_dates[findInterval(x, ref_dates)]
      return(ifelse(length(the_date) == 0, NA, the_date))
    }   
    

    函数会被如下调用,包括origin,因为日期变为数字:

    sample_data$Ref_Date <- as.Date(sapply(sample_data$Date, my_fun), origin = '1970-01-01')
    

    这会给你这个:

            Date   Ref_Date
    1 2014-11-11 2014-09-19
    2 2015-06-10 2014-09-19
    3 2018-01-05 2017-10-26
    4 2019-05-01 2017-10-26
    

    您可以计算两个日期之间的差异(在这种情况下存储为整数):

    sample_data$Difftime <- as.integer(round(difftime(sample_data$Date, sample_data$Ref_Date, units = "days")))
    

    然后,您可以应用您的规则。选项可能包括case_when(来自dplyr)或更新的fcase,来自最新的data.table(速度很快)。

    library(data.table)
    
    setDT(sample_data)
    
    sample_data[ , Difftime_final := fcase(
      Difftime < 180L, Difftime,
      Difftime < 365L, 180L,
      Difftime >= 365L, NA_integer_
    )]
    

    给出最终结果:

             Date   Ref_Date Difftime Difftime_final
    1: 2014-11-11 2014-09-19       53             53
    2: 2015-06-10 2014-09-19      264            180
    3: 2018-01-05 2017-10-26       71             71
    4: 2019-05-01 2017-10-26      552             NA
    

    【讨论】:

    • 嗨,本,感谢您的代码!在这一点上,我有一个问题:您能澄清一下 [findInterval()] 语句的编码吗?似乎发布的答案被截断为“[findInt”。谢谢你的帮助;非常感谢!
    • 本,别担心!老实说,我不知道文本下方的灰色条是什么意思!让我试一试,我会回复你的。打扰了!!!
    • Ben,当 'RefDate' 设置为字符或日期时似乎有问题(我的编辑): as.POSIXct.default(time2) 中的错误:不知道如何转换'time2' 到类“POSIXct”。当我将格式从 'as.character' 更改为 'as. Date',结构为“Date[1:1],格式为“2017-10-26”。那么,为什么会出现POSIX错误?感谢您的帮助。
    • 这是我尝试过的:Records2$RefDate
    • Ben,这是我使用的全部代码:ref_dates
    猜你喜欢
    • 2012-04-16
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多