我有一个看起来如下的数据框:
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变量。请帮忙。
答案 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)]