Il trattamento dei dati di ricovero ospedaliero utilizzando R (parte II)

StackOverflow https://stackoverflow.com/questions/4163352

  •  08-10-2019
  •  | 
  •  

Domanda

Grazie a tutti per fornire suggerimenti sulla questione dei dati di ricovero ospedaliero utilizzando R , ho domanda Inoltre su questo tema, in realtà, dovrebbe essere il compito che a questa domanda.

Ora ho un set di dati in questo modo:

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

ho bisogno di convertirlo in:

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

Attualmente ho convertirlo usando ddply, il codice è fissato al di sotto:

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

Questo può risolvere il mio problema, ma è molto lento (più di 20 minuti su una macchina P4 3.2) quando il dataset è avere 8818 e il 1861 unique(Patients_ID) unique(Date). Come posso migliorare questo? Grazie!

È stato utile?

Soluzione

Una cosa che funziona è questo, supposto che i tuoi dati siano in oggetto 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)]

e dà:

> 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

Si dovrebbe estendere felicemente a più pazienti, ecc, ed è un po 'più veloce rispetto la versione 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

Tuttavia, questo non significa che il ddply() non può essere accelerato -. Non ho familiarità con questo pacchetto

Se la scala due versioni in un modo simile - cioè solo perché la versione aggregate() è più veloce in queste prove ripetute sui dati semplici, non significa che si otterrà lo stesso beneficio se applicato al compito molto più grande - resti a da vedere, ma lascio a voi di testare le due versioni su piccoli sottoinsiemi di dati con più di un paio di pazienti per vedere quanto bene scala.


Modifica Un rapido test - ripetendo i dati dei pazienti hai dato di generare quattro nuovi pazienti (dando 5 in totale), tutte con gli stessi dati, suggerisce che quella aggregata scale un po 'meglio. Tempo di esecuzione per la versione aggregate() è andato fino a 4,6 secondi per il 1000 ripetizioni (~ un raddoppio), mentre i tempi per la versione ddply() andato fino a 52 secondi (~ a quadruplicare).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top