gpt4 book ai didi

R:在填充数据框 B 中的一行之前,使用某个日期的数据框 A 中的值

转载 作者:行者123 更新时间:2023-12-04 10:13:38 25 4
gpt4 key购买 nike

这可能非常复杂,我怀疑需要高级知识。我现在有两种不同类型的 data.frames 我需要组合:

数据:

数据框 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 还包含一堆其他测试日期,最终输出不需要这些日期。

最佳答案

这里使用 data.table的滚动连接:

require(data.table)
setkey(setDT(df_A), MRN, Transfusion.Date)
setkey(setDT(df_B), MRN, Test.Date)

df_B[df_A, roll=TRUE]
# MRN Test.Date Test.Result
# 1: 1 2000-01-01 negative
# 2: 1 2000-01-30 900 copies/ul
# 3: 2 2003-04-01 negative
# 4: 3 2003-04-01 NA
  • setDT转换 data.framedata.table通过引用(没有任何额外的复制)。这将导致 df_Adf_B现在是data.tables。
  • setkey排序 data.table通过我们提供的列,并将这些列标记为键列,这允许我们使用基于二分搜索的连接。
  • 我们执行表单 x[i] 的连接在关键列上,其中对于 i 的每一行, x 的匹配行(如果有,否则不适用)以及 i的行被返回。这就是我们所说的 equi-join。通过添加 roll = TRUE ,在不匹配的情况下,最后一次观察被结转(LOCF)。这就是我们所说的滚动连接。按升序排序(由于 setkey() )确保最后一次观察是最近的日期。

  • HTH

    关于R:在填充数据框 B 中的一行之前,使用某个日期的数据框 A 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27152719/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com