这可能非常复杂,我怀疑需要高级知识。现在我有两种不同类型的数据框需要合并:
数据:
数据框A:
按患者ID列出所有输血日期。每次输血都由单独的行表示,患者可以有多次输血。不同的患者可以在同一天接受输血。
Patient ID Transfusion.Date
1 01/01/2000
1 01/30/2000
2 04/01/2003
3 04/01/2003
类型B的数据帧包含同一病人ID的其他日期的测试结果:
Patient ID Test.Date Test.Value
1 11/30/1999 negative
1 01/15/2000 700 copies/uL
1 01/27/2000 900 copies/uL
2 03/30/2003 negative
我希望得到的是一个与Dataframe A行数相同的Dataframe,每个输血对应一行,并且最近的Test.Value应该作为单独的一列呈现。每次输血日期应该显示在其最近测试结果之前。
期望输出:
-->
Patient ID Transfusion.Date Pre.Transfusion.Test
1 01/01/2000 negative
1 01/30/2000 900 copies/ul
2 04/01/2003 negative
3 04/01/2003 NA
我认为一般策略是按病人ID子集化数据框。然后获取病人1的所有输血日期,对于每个元素,检查哪个结果最接近所有可用测试日期,然后返回最接近的值。
如何解释R来执行这个操作?
编辑1:这里是这些示例的R代码
df_A <- data.frame(MRN = c(1,1,2,3),
Transfusion.Date = as.Date(c('01/01/2000', '01/30/2000',
'04/01/2003','04/01/2003'),'%m/%d/%Y'))
df_B <- data.frame(MRN = c(1,1,1,2),
Test.Date = as.Date(c('11/30/1999', '01/15/2000', '01/27/2000',
'03/30/2003'),'%m/%d/%Y'), Test.Result = c('negative',
'700 copies/ul','900 copies/ul','negative'))
编辑2:
为了澄清,最终数据应该是:病人A在X日和Y日接受了输血(对于df_A)。在第一次输血前,他最近的检测结果为X(df_B中最接近第一次输血的检测日期)。在第二次输血之前,他最近的检测结果为Y(也在df_B中,在第二次输血之前)。df_B还包含一堆其他的测试日期,这些对最终结果不需要。
merge(df_A, df_B, by.x = "Patient.ID", by.y = "Patient.ID", all.x = TRUE)
,然后尝试使用lubridate
包添加日期差异列。 - JasonAizkalnsdplyr
,通过summarise()
轻松进行group_by()
汇总 -- 按照患者ID和日期的组合进行分组,然后获取对应最小距离的记录。 - JasonAizkalnsdf_AB <- merge(df_A, df_B, by.x = "Patient.ID", by.y = "Patient.ID", all.x = TRUE) df_AB %>% mutate(Date.difference = Test.Date - Transfusion.Date) 给我所有的日期差异,这非常有帮助。现在尝试筛选出所有最小负日期差异的行。
- col. slade