在应用函数时有条件地合并两个 data.tables 的最有效方法

问题描述

我有大 data.table cohort_D0_multvis 随时间变化的相遇日期(即 CONTACT_DATE),我想将此 data.table 与多个实验室数据集合并,也是大 data.table 的;对于每个 CONTACT_DATE,我想保留最接近但严格低于遇到日期的实验室测量值。我还想保留任何没有任何实验室数据的记录或不符合上述语句逻辑的记录。

我能够将随时间变化的遭遇日期 cohort_D0_multvis 的 data.table 与实验室数据 A1c 的 data.table 合并,同时以 CONTACT_DATE>LAB_DATE 为条件,如下所示:

>

条件合并:

test <- cohort_D0_multvis[unique(A1c),on = .(ID,CONTACT_DATE > LAB_DATE),nomatch = 0,.(ID,CONTACT_DATE = x.CONTACT_DATE,LAB_DATE,A1c)]

接下来,我创建了一个新列 test[,date_diff:=as.numeric(CONTACT_DATE-LAB_DATE),然后使用 .SD[which.min(date_diff)] 保留最接近相遇日期的实验室测量值。最后,我将这些剩余的记录合并回我的遭遇数据,以引入可能由于上述条件逻辑而被删除的任何记录,如下所示:

中间步骤:

test[,date_diff:=as.numeric(CONTACT_DATE-LAB_DATE)]
test <- test[,.SD[which.min(date_diff)],by=.(ID,CONTACT_DATE)]
test <- merge(test,cohort_D0_multvis,by=c("ID","CONTACT_DATE"),all.y = TRUE)

最终数据集:

### This is exactly what I want
   ID CONTACT_DATE   LAB_DATE      A1c date_diff
 1:  A   2002-01-26 2000-09-30 4.938065       483
 2:  A   2004-10-26 2000-09-30 4.938065      1487
 3:  A   2006-09-01 2000-09-30 4.938065      2162
 4:  A   2014-05-23 2007-12-08 6.170197      2358
 5:  A   2017-01-28 2007-12-08 6.170197      3339
 6:  A   2020-04-16 2007-12-08 6.170197      4513
 7:  B   1998-03-02       <NA>       NA        NA
 8:  B   2003-05-08       <NA>       NA        NA
 9:  B   2004-09-27 2003-10-14 7.071354       349
10:  B   2008-11-05 2007-06-04 5.173654       520
11:  B   2015-11-24 2014-06-03 6.100639       539
12:  C   1993-08-30       <NA>       NA        NA
13:  C   1993-10-04       <NA>       NA        NA
14:  C   1996-07-01 1995-07-28 5.852059       339
15:  C   1996-11-08 1995-07-28 5.852059       469
16:  C   1999-02-19 1995-07-28 5.852059      1302
17:  C   2012-01-03 2005-03-16 6.640102      2484
18:  C   2020-05-17 2018-11-23 4.729267       541

然而,我正在处理的实际遭遇数据和实验室数据有超过 130 万条记录,上面的条件合并将导致输出具有重复的唯一遭遇,每个唯一的实验室记录按 ID(即,超过 nrow( x)+nrow(i) 行)。我必须重复这个过程大约 10 次(即将大约 10 个实验室数据集合并到遭遇数据集),这将非常耗费时间和内存。

我的问题:

  • 在进行条件合并时,是否有一种更有效的方法可以到达我的最终数据集,而无需创建包含多于 nrow(x)+nrow(i) 行的数据集?

非常感谢任何建议或帮助。下面是重现我的输出代码

可重现的示例:

library(data.table)
library(lubridate)

### Create sample cohort with screening dates
set.seed(1992)
cohort_D0_multvis <- data.table(ID=c(rep("A",6),rep("B",5),rep("C",7)),CONTACT_DATE=c(sample(seq(as_date('1992/01/01'),as_date('2021/06/04'),by="day"),sample(seq(as_date('1992/01/01'),7)))

setkeyv(cohort_D0_multvis,c("ID","CONTACT_DATE"))
cohort_D0_multvis

### Create sample a1c data with lab dates
set.seed(304)
A1c <- data.table(ID=c(rep("A",LAB_DATE=c(sample(seq(as_date('1992/01/01'),A1c=rnorm(18,5.7,1))
setkeyv(A1c,"LAB_DATE"))
A1c

### For every CONTACT_DATE we want to retain the lab measurement that occurs closest to,but strictly lower,than the screening date
test <- cohort_D0_multvis[unique(A1c),A1c)]

test[,CONTACT_DATE)]
# Bring back patients w/o lab data
test <- merge(test,all.y = TRUE)
test

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...