2010-11-12 27 views
2

Merci à tous pour fournir une suggestion sur la question processing of hospital admission data using R, j'ai plus question sur cette question, en fait, il devrait être la tâche avant cette question.traitement des données d'admission à l'hôpital en utilisant R (partie II)

Maintenant, j'ai un ensemble de données comme ceci:

Patient_ID Date Ward 
P001  1 A 
P001  2 A 
P001  3 A 
P001  4 A 
P001  4 B 
P001  5 B 
P001  6 B 
P001  7 B 
P001  7 C 
P001  8 B 
P001  9 B 
P001  10 B 

je dois le convertir en:

Patient_ID Date Ward 
P001  1 A 
P001  2 A 
P001  3 A 
P001  4 A;B 
P001  5 B 
P001  6 B 
P001  7 B;C 
P001  8 B 
P001  9 B 
P001  10 B 

Actuellement je convertir en utilisant ddply, le code est ci-joint:

data <- ddply(data, 
       c("Patient_ID", "Date"), 
       function(df) 
       {data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";")) 
       }, 
       .progress="text" 
      ) 

Cela peut résoudre mon problème, mais il est très lent (plus de 20 minutes sur un P4 3.2 mac hine) lorsque l'ensemble de données contient 8818 unique(Patients_ID) et 1861 unique(Date). Comment puis-je améliorer cela? Merci!

Répondre

3

Quelque chose qui fonctionne est ce, en supposant que vos données sont en objet pdat

res <- with(pdat, 
      aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID), 
         FUN = paste, collapse = ";")) 
names(res)[3] <- "Ward" 
res <- res[, c(2,1,3)] 

et donne:

> res 
    Patient_ID Date Ward 
1  P001 1 A 
2  P001 2 A 
3  P001 3 A 
4  P001 4 A;B 
5  P001 5 B 
6  P001 6 B 
7  P001 7 B;C 
8  P001 8 B 
9  P001 9 B 
10  P001 10 B 

Il devrait étendre heureusement à plus de patients, etc., et est un peu plus rapide que votre version ddply():

> system.time(replicate(1000,{ 
+ res <- with(pdat, 
+    aggregate(Ward, by = list(Date = Date, Patient_ID = Patient_ID), 
+      FUN = paste, collapse = ";")) 
+ names(res)[3] <- "Ward" 
+ res <- res[, c(2,1,3)] 
+ })) 
    user system elapsed 
    2.113 0.002 2.137 

vs

> system.time(replicate(1000,{ 
+ ddply(pdat, 
+  c("Patient_ID", "Date"), 
+  function(df) 
+  data.frame(Ward=paste(unique(df[,"Ward"]),collapse=";")) 
+  ) 
+ })) 
    user system elapsed 
12.862 0.006 12.966 

Cependant, cela ne signifie pas que le ddply() ne peut pas être accéléré - Je ne suis pas au courant de ce paquet. Si les deux versions évoluent d'une manière similaire - c'est-à-dire que la version aggregate() est plus rapide dans ces tests répétés sur des données simples, cela ne signifie pas que vous obtiendrez le même bénéfice pour la tâche beaucoup plus importante - reste pour être vu, mais je vais vous laisser tester les deux versions sur de petits sous-ensembles de vos données avec plus de quelques patients pour voir à quel point ils évoluent.


Edit: Un test rapide - répéter les données du patient que vous nous avez donné pour générer quatre nouveaux patients (ce qui donne 5 au total), tous avec les mêmes données, suggère que l'un agrégat des échelles un peu mieux. Le temps d'exécution pour la version aggregate() est passé à 4,6 secondes pour les 1000 répétitions (~ un doublage) tandis que le temps pour la version ddply() est passé à 52 secondes (~ un quadruplement).