2017-08-16 1 views
0

Ich habe zwei Datenrahmen, einer der Krankenhausaufenthalte, und der andere der Laborergebnisse. Ich muss identifizieren, in welchem ​​Krankenhaus ein Laborergebnis gespeichert wird, und die Aufnahme- und Entlassungsdaten aus dem Krankenhausdatenrahmen in die Zeile für das relevante Laborergebnis kopieren.Verbessern Sie die Effizienz beim Verknüpfen von Daten aus zwei Datenrahmen

Ich mache dies mit einer for-Schleife, um durch die Laborergebnisse zu gehen, und dann, wenn Anweisungen und Untergruppen, die nach übereinstimmenden Einträge (von Patienten SSN und umgebenden Daten) in den Krankenakten suchen.

Dies ist ein ziemlich großer Datensatz und die Verwendung der For-Schleife ist sehr langsam. Gibt es eine Möglichkeit, diese Art von Problem zu beschleunigen? (Ich habe mehrere ähnliche Probleme, so würde eine Antwort lieben.)

Beispieldaten hinzugefügt, beachten Sie, dass es mehrere Krankenhaus Datensätze für jeden Patienten mit dem Ziel, die Daten aus dem Datensatz zu erhalten, wo die Daten das Labordatum überlappen . In diesem Beispiel sollte der resultierende Datenrahmen nur Aufnahme- und Entlassungsdaten für Patient 1 haben, da Patient 2 keine Krankenhausdaten hat und die Datensätze von Patient 3 das Labordatum nicht überlappen.

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 

} 

Der gewünschte Datenrahmen aussehen würde:

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 

Hinweis, in den realen Daten, gibt es auch das Problem von mehreren Krankenhausakten der Qualifikation (Entladungen zwischen Abteilungen) diese Aufzeichnungen würden das gleiche haben Aufnahmedatum, aber unterschiedliche Entladezeiten, wobei die letzte wichtig ist. Aber der Reihe nach ...

+3

Könnten Sie bitte Beispieldaten zeigen, und was ist die erwartete Ausgabe? Es wird anderen helfen, Ihnen richtig zu helfen. – Sagar

+0

versuchen, die beiden Datenrahmen mit 'dplyr'' Join'-Funktionen zusammenzuführen. Wenn Sie Beispieldaten reproduzieren, können wir Ihnen dabei helfen. – sweetmusicality

+0

Beispieldaten zur Verfügung gestellt. Zusammenführen wird nicht funktionieren, da das Datumsproblem nicht erkannt wird. – rwbuie

Antwort

0

Angenommen, dies ist ähnlich zu dem, was Ihr df aussieht, verwenden 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> 

Beachten Sie, dass Ihre ID Variable (PatientSSN) sind die gleichen in jeder Tabelle.

+0

Dies ignoriert das Datumsproblem. Die Laborergebnisse haben auch Daten, und die einzigen Aufnahme- und Entlassungsdaten, die ausgewählt werden sollten, sind diejenigen, die das Datum des Labors umgeben. eine einfache Zusammenführung tut dies nicht (nach meinem Wissen) – rwbuie

0

OK- hier ist eine Methode. Nur ein kurzer Blick in die Höhe. Es ist ziemlich unwahrscheinlich, dass Sie jemals mit EMR-Daten arbeiten werden, die keine für einen Besuch/Konto spezifische ID-Variable haben. Ich würde versuchen, das als eindeutige Kennung zu verwenden, bevor ich SSN verwendet habe. Dennoch; das sollte funktionieren. Ich habe die oben angegebenen Daten verwendet.

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

Das wäre also fast doppelt so schnell, weil es nur den stationären Datenrahmen einmal scannt? – rwbuie

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Kein Weg um die for-Schleife sehe ich. Wenn Sie für den SSN den Patienten über mehrere Einrichtungen hinweg abstimmen möchten, wird die Verwendung der internen Kennung der jeweiligen Einrichtung nicht bevorzugt. – rwbuie

1

Ein nicht equi kommen Werke, zum Beispiel mit 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> 

in den realen Daten, gibt es auch das Problem von mehreren Krankenhausakten der Qualifikation (Entladungen zwischen Abteilungen), um diese Aufzeichnungen hätten das gleiche Aufnahmedatum, aber unterschiedliche Entladungszeiten, wobei die letzte wichtig ist.

Wenn hospitalRec sortiert wird, das Hinzufügen mult="last" oben funktionieren sollte. Eine vollständige Dokumentation finden Sie unter ?data.table. Alternativ können Sie nur eine Version der Krankenhausaufzeichnungen erstellen, die diese „Duplikate“ schließt, wie ... sortieren und dann

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

Die setorder Funktion ist das Standardwerkzeug für data.tables Sortierung.

Verwandte Themen