Il trattamento dei dati di ricovero ospedaliero utilizzando R (parte II)
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!
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).