[英]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.