【发布时间】:2015-01-24 23:47:55
【问题描述】:
这可能非常复杂,我怀疑需要高级知识。我现在需要组合两种不同类型的 data.frame:
数据:
数据框 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 具有相同的行数(每次输血 1),并且最近的 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 对 data.frames 进行子集化。然后获取患者 1 的所有输血日期,检查哪个结果与每个元素的所有可用 test_dates 最接近,然后返回最接近的值。
我如何解释 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 天输血之前,他最近的测试结果是 X(最接近第一次输血的测试日期,在 df_B 中)。在Y天输血之前,他最近的测试结果是Y(在第二次输血之前,也在df_B中。df_B还包含一堆其他测试日期,最终输出不需要。
【问题讨论】:
-
这应该让你开始
merge(df_A, df_B, by.x = "Patient.ID", by.y = "Patient.ID", all.x = TRUE)然后尝试使用包lubridate添加日期差异列。 -
@jaysunice3401 谢谢你的回答,这就是我现在的位置,但是这样我得到了很多额外的行,因为测试结果比输血更多。我认为我需要做的是将 df_B 减少到相同数量的 pt ID 行,使用你告诉我的包......现在调查!
-
也可以通过
summarise()查看dplyr以方便group_by()摘要——按患者ID和日期的组合进行分组,然后获取与最小距离相对应的记录。 -
@jaysunice3401,你能再帮我一些吗,我不知道我需要如何将它与 BondedDust 的代码结合起来,(?似乎不需要润滑?)想出一个可行的解决方案.
-
@jaysunice3401 感谢您提到 dplyr,正如您所建议的,我使用了合并:df_AB % mutate(Date.difference = Test.Date - Transfusion.Date) 给了我所有的日期差异,这非常有帮助。现在尝试使用最小的负 Date.difference 对所有行进行子集化