【发布时间】:2020-06-30 17:08:55
【问题描述】:
我有 2 个如下所示的 dfs:
df1 <- data.frame(ID = c("1", "1", "1", "2", "2", "2"),
testdate = as.POSIXct(c("2010-3-20", "2018-04-12","2018-04-25","2011-04-17","2011-09-05","2019-04-16")),
testvalue = (c(17, 35, 44, 65, 21, 22)))
df2 <- data.frame(ID = c("1", "1", "2", "2", "2"),
begindate = as.POSIXct(c("2018-04-10","2018-04-30","2011-04-12","2011-07-15","2018-01-21")),
enddate = as.POSIXct(c("2018-04-22","2018-05-12","2011-04-30","2011-07-30","2018-01-29")),
Dose = (c("2x per day", "1x per day", "1x morning", "2x morning", "3x per day")))
Df1 有某天受试者的测试值。 Df2 包含受试者在特定时期之间的处方。
我想通过ID 合并两个dfs,如果testdate 介于df2.begindate 和df2.enddate 之间,或者如果testdate 在df2 中有一个前面的“处方”,那么我想要最近的“处方”(见新 df 的第 3 行)。
最终的df应该是这样的,我也想把所有的数据都保存在df1中。
ID testdate testvalue begindate enddate dose
1 1 2010-03-20 17 NA NA NA
2 1 2018-04-12 35 2018-04-10 2018-04-22 2x per day
3 1 2018-04-25 44 2018-04-10 2018-04-22 2x per day
4 2 2011-04-17 65 2011-04-12 2011-04-30 1x morning
5 2 2011-09-05 21 2011-07-15 2011-07-30 2x morning
6 2 2019-04-16 22 2018-01-21 2018-01-29 3x per day
我试过这个:Find nearest preceding and following dates between data frames,但没有成功。我不断得到多行,不仅包含最近的“处方”,而且都来自某个测试日期之前,这不是我想要的。
编辑: 我试过这个:
setDT(df1)
setDT(df2)
setkey(df1, ID, testdate)
setkey(df2, ID, begindate)[, PrecedingDate:=begindate]
result <- df2[df1, roll=Inf]
但这不适用于新 df 中的第 3 行并调整我希望在 df 中包含的 testvalue 日期。
【问题讨论】:
-
df1 中的一个日期是“2018-04-09-25”,这显然是错误的。同样在第 3 行的输出中,begindate 不在 testdata 之前。
-
@jay.sf 我已经粘贴了代码
-
@G.Grothendieck,错误调整,确实是不是前面,我已经调整了句子