首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高链接来自两个数据帧数据的效率

提高链接来自两个数据帧数据的效率
EN

Stack Overflow用户
提问于 2017-08-17 01:58:32
回答 3查看 60关注 0票数 0

我有两个数据框,一个是住院记录,另一个是实验室结果。我需要确定实验室结果发生在哪个医院,并将医院数据框中的入院和出院日期复制到相关实验室结果的行中。

我使用一个for循环遍历实验室结果,然后使用if语句和子集在医院记录中查找匹配条目(按患者SSN和周围日期)。

这是一个相当大的数据集,使用for循环非常慢。有没有办法加速这类问题?(我有几个类似的问题,所以我想知道答案。)

添加了样本数据,请注意,每个患者都有多个医院记录,目标是从日期与实验室日期重叠的记录中获取日期。在本例中,结果数据框应该只包含患者1的入院和出院日期,因为患者2没有医院数据,并且患者3的记录不会与实验室日期重叠。

代码语言:javascript
复制
testDate <- as.Date(c("2017-01-15", "2017-01-15", "2017-01-15"))
patientSSN <- c("1","2","3")
labs <- data.frame(patientSSN, testDate)

#   patientSSN   testDate
# 1          1 2017-01-15
# 2          2 2017-01-15
# 3          3 2017-01-15

patientSSN <- c("1","1","3","3")
admissionDate <- as.Date(c("2017-01-07", "2017-02-01", "2016-12-01", "2017-01-16"))
dischargeDate <- as.Date(c("2017-01-16", "2017-02-10", "2016-12-15", "2017-02-01"))
hospitalRec <- data.frame(patientSSN, admissionDate, dischargeDate)

for (I in 1:nrow(labs)) {
labs[I,]$admissionDate <- hospitalRec[hospitalRec$patientSSN == labs[I,]$patientSSN & hospitalRec$admissionDate <= labs[I,]$testDate & hospitalRec$dischargeDate >= labs[I,]$testDate,]$admissionDate

labs[I,]$admissionDate <- hospitalRec[hospitalRec$PatientSSN == labs[I,]$PatientSSN & hospitalRec$admissionDate <= labs[I,]$testDate & hospitalRec$dischargeDate >= labs[I,]$testDate,]$dischargeDate

}

所需的数据帧将如下所示:

代码语言:javascript
复制
labs:
    patientSSN  testDate   admissionDate  dischargeDate
    1           2017-01-15 2017-01-07     2017-01-16
    2           2017-01-15 NA             NA
    3           2017-01-15 NA             NA

注意,在实际数据中,还存在多个医院记录符合条件的问题(部门之间的出院)这些记录将具有相同的入院日期,但不同的出院时间,其中最新的一个是重要的。但首先要做的是...

EN

回答 3

Stack Overflow用户

发布于 2017-08-23 03:18:16

非对等连接可以工作,例如使用data.table:

代码语言:javascript
复制
library(data.table)
setDT(labs); setDT(hospitalRec)

labs[hospitalRec, on=.(patientSSN, testDate >= admissionDate, testDate <= dischargeDate),
  `:=`(aDate = i.admissionDate, dDate = i.dischargeDate)]

   patientSSN   testDate      aDate      dDate
1:          1 2017-01-15 2017-01-07 2017-01-16
2:          2 2017-01-15       <NA>       <NA>
3:          3 2017-01-15       <NA>       <NA>

在真实数据中,还存在多个医院记录合格的问题(科室之间的出院)这些记录将具有相同的入院日期,但不同的出院时间,其中最新的一个是重要的。

如果对hospitalRec进行了排序,则添加上面的mult="last"应该可以。有关完整文档,请参阅?data.table。或者,您可以只创建一个不包含这些“重复项”的医院记录版本,例如...排序,然后

代码语言:javascript
复制
lastRec = unique(hospitalRec, by=c("patientSSN", "admissionDate"), fromLast=TRUE))

setorder函数是对data.tables进行排序的标准工具。

票数 1
EN

Stack Overflow用户

发布于 2017-08-17 02:18:30

假设这与您的df类似,请使用dplyr::left_join

代码语言:javascript
复制
hospital_data <- data.frame(PatientSSN  = c('1234567890','9876543210'),
                            admit = c('8/1/17','8/5/17'),
                            discharge = c('8/10/17','8/15/17'))

lab_data <- data.frame(specimen_id = c('foo1','foo2','foo3','foo4','foo5','foo6','foo7'),
                       PatientSSN = c('1234567890','1234567890','1234567890','9876543210','9876543210','9876543210','8527419600'),
                       test = c('hemoglobin','inr','platelette','hemoglobin','inr','platelette','inr'))

lab_data %>% left_join(hospital_data)

 specimen_id PatientSSN       test  admit discharge
1        foo1  1234567890 hemoglobin 8/1/17   8/10/17
2        foo2  1234567890        inr 8/1/17   8/10/17
3        foo3  1234567890 platelette 8/1/17   8/10/17
4        foo4  9876543210 hemoglobin 8/5/17   8/15/17
5        foo5  9876543210        inr 8/5/17   8/15/17
6        foo6  9876543210 platelette 8/5/17   8/15/17
7        foo7  8527419600        inr   <NA>      <NA>

注意,您的id变量(PatientSSN)在每个表中都是相同的。

票数 0
EN

Stack Overflow用户

发布于 2017-08-17 23:37:51

好的--这是一个方法。不过,提醒一下,您不太可能处理没有特定于访问/帐户的ID变量的EMR数据。在我使用SSN之前,我会考虑使用它作为唯一标识符。然而,这应该是可行的。我使用了你上面提供的数据。

代码语言:javascript
复制
for(i in 1:nrow(labs)){

  #finding the ID (ssn)

  ssn_match_df <- hospitalRec[which(as.character(labs$patientSSN[i]) == as.character(hospitalRec$patientSSN)),]

  #finding record in table where the test date fall between the admit/discharge
  ssn_match_df <- ssn_match_df[which(labs$testDate[i] >= ssn_match_df$admissionDate &
                                       labs$testDate[i] <= ssn_match_df$dischargeDate),]

  if(nrow(ssn_match_df)>0){
    labs[i,3] <- as.character(ssn_match_df[1,2])
    labs[i,4] <- as.character(ssn_match_df[1,3])
  } else {
    labs[i,3] <- NA
    labs[i,4] <- NA
  }


}

colnames(labs)[3] <- 'admitDate'
colnames(labs)[4] <- 'dischargeDate'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45720182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档