获取R的数据框中最近的日期并获取记录

时间:2019-08-01 14:48:49

标签: r dataframe

我有一个看起来如下的数据框:

id    OrderDate_1    OrderDate_2    OrderDate_3    NewEnrollDate
1     05/01/2018     01/02/2019     NA             02/15/2019
2     03/02/2019     NA             NA             05/05/2019
3     12/15/2017     12/12/2018     05/01/2019     06/01/2019

我想要一个遍历数据帧的每个记录并标记该记录的逻辑,这对于随后的逻辑是正确的

NewEnrollDate> = OrderDate_X,而OrderDate_X最接近NewEnrollDate

它还应该返回经过上述逻辑的OrderDate_X并给我一张下表

id    OrderDate_1    OrderDate_2    OrderDate_3    NewEnrollDate   MatchDT
1     05/01/2018     01/02/2019     NA             02/15/2019      01/02/2019
2     03/02/2019     NA             NA             05/05/2019      03/02/2019
3     12/15/2017     12/12/2018     05/01/2019     06/01/2019      05/01/2019

此外,如果它还有一个附加列来标记记录通过NewEnrollDate> = OrderDate_X逻辑的记录,则

我尝试使用日期之间的差异并获取它们的最小值,但它似乎无法很好地与NA值配合使用,并且它也不会向我返回MatchDT变量。请帮忙。

1 个答案:

答案 0 :(得分:0)

我设法通过使用{data.table}来做到这一点。

我已阅读您有关多列(多于3列)订购日期的问题。在这种情况下,我使用了某种匹配来捕获所有带有“ OrderDate”模式的列。

对于每个列,我创建了一个新的列,该列的订购日期小于或等于NewEnrollDate,否则为NA。

然后从这些新列中,使用参数na.rm = T来获取最大值,以处理缺失值。

library(data.table)

DT <-
  data.table(id = c(1:3),
             OrderDate_1 = as.POSIXct("2018-05-01", "2019-03-02", "2017-12-15"),
             OrderDate_2 = as.POSIXct("2019-01-02", NA, "2018-12-12"),
             OrderDate_3 = as.POSIXct(NA, NA, "2019-05-01"),
             NewEnrollDate = as.POSIXct("2019-02-15", "2019-05-05", "2019-06-01"))

OldNames <- names(DT)[grepl("OrderDate", names(DT))]
NewNames <- paste0(OldNames, "New")

for(i in 1:length(OldNames)){

  setnames(DT, OldNames[i], "PlaceHolder1")
  DT[NewEnrollDate >= PlaceHolder1, PlaceHolder2 := PlaceHolder1]
  setnames(DT, "PlaceHolder1", OldNames[i])
  setnames(DT, "PlaceHolder2", NewNames[i])

}

DT[, MatchDT := pmax(OrderDate_1New, OrderDate_2New, OrderDate_3New, na.rm = T)]