繁体   English   中英

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

[英]Get the nearest date in a dataframe of R and fetch the record

我有一个数据框架,如下所示:

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变量。 请帮忙。

我通过使用{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)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM