2017-08-16 54 views
0

我有兩個數據幀,一個留院,另一個是實驗室結果。我需要確定哪個醫院留有實驗室結果,並將入院和出院日期從醫院數據框複製到相關實驗室結果的行中。提高鏈接兩個數據幀中的數據的效率

我正在用for循環來查看實驗室結果,然後查看醫院記錄中是否包含匹配條目(通過患者SSN和周圍日期)的語句和子集。

這是一個相當大的數據集,使用for循環非常慢。有沒有辦法來加速這種問題? (我有幾個類似的問題,所以會喜歡答案。)

添加樣本數據,請注意,每個患者有多個醫院記錄,目標是從記錄中的日期重疊實驗日期。在本例中,由於患者2沒有醫院數據,因此生成的數據框應該只有患者1的入院和出院日期,患者3的記錄不會與實驗日期重疊。

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 

} 

所需的數據幀將如下所示:

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 

注意,在真實的數據,也有多個醫院記錄預選賽(部門之間的放電),這些記錄將具有相同的問題入學日期,但不同的排放時間與最新的一個是重要的。但是,先...

+3

您能否請求顯示示例數據,以及預期的輸出是什麼?它會幫助他人正確地幫助你。 – Sagar

+0

嘗試使用'dplyr'的'join'函數合併兩個數據框。如果您複製樣本數據,我們可以提供幫助。提供的樣本數據爲 – sweetmusicality

+0

。合併將不起作用,因爲它不會識別日期問題。 – rwbuie

回答

0

假設這是類似於您的DF是什麼樣子,用dplyr::left_join

hospital_data <- data.frame(PatientSSN = c('1234567890',''), 
          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','','','','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  foohemoglobin 8/5/17 8/15/17 
5  foo inr 8/5/17 8/15/17 
6  fooplatelette 8/5/17 8/15/17 
7  foo7 8527419600  inr <NA>  <NA> 

請注意,你的id變量(PatientSSN)是每個表中的相同。

+0

這忽略了日期問題。實驗結果也有日期,應該選擇的唯一入場和出場日期是圍繞實驗室日期的日期。一個簡單的合併不會這樣做(據我所知) – rwbuie

0

OK-這是一種方法。儘管如此,只是快速提高了頭腦。您不可能使用沒有特定於訪問/帳戶的ID變量的EMR數據。我希望在使用SSN之前將其用作唯一標識符。儘管如此;這應該工作。我使用了上面提供的數據。

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

所以這會快兩倍,因爲它只掃描一次住院數據幀? – rwbuie

+0

謝謝你指出。沒有辦法繞過我看到的for循環。至於SSN,當您想跨多個設施匹配患者時,使用每個設施的內部標識符不是首選。 – rwbuie

1

非等距參加工作,例如用data.table:

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。或者,你可以只創建一個版本的排除這些「複製品」,一樣......排序醫院記錄,然後

lastRec = unique(hospitalRec, by=c("patientSSN", "admissionDate"), fromLast=TRUE)) 

setorder功能是排序data.tables的標準工具。