[R-es] Mi script R es muy lento

Eric ericconchamunoz en gmail.com
Vie Mayo 29 19:49:15 CEST 2015


Hola MªLuz, no se si es el mas rapido de todas las opciones que
existen, pero es muy muy rapido y el mas rapido que yo he usaado ... y
es bastante practico para realizar operaciones complejas con tablas,
aunque hay algunas cosas que no he sabido pasar de data.frames y
bucles a data.table, pero la verdad pienso que es mi falta y que lo
mas probable es que se pueda.

Saludos, eric.

On 5/29/15, MªLuz Morales <mlzmrls en gmail.com> wrote:
> Hola, quiero compartir con vosotros mi problema y la solución que me han
> planteado. Mi programa carga Outcomes.csv y Set-A.csv  (descargados de
> http://garrickadenbuie.com/blog/2013/04/11/visualize-physionet-data-with-r/,
> apartado Getting Started --> the code and the data set) de unos 50MB entre
> los dos. Mi código era:
>
>
> #  Transforma csv a data frame
> seta <- read.csv('Set-A.csv');
> outcomes <- read.csv('Outcomes-A.csv');
>
> ids <- as.character(unique(outcomes$RecordID));
> ## Número de RecordsID distintos
> Length_ids <- length(ids); #número de RecordsID distintos
> ListaABP <- list('RecordID'=-1,'SAPS.I'=-1, 'SOFA'=-1, 'Survival'=-1,
> 'In.hospital_death'=-1, 'NISysABP_Min'=-1,'NISysABP_Max'=-1,
> 'NISysABP_Mean'=-1, 'NIDiasABP_Min'=-1,'NIDiasABP_Max'=-1,
> 'NIDiasABP_Mean'=-1,'NIMAP_Min'=-1,'NIMAP_Max'=-1, 'NIMAP_Mean'=-1);
> for (i in 1:Length_ids){#NumRecordID){   # Para cada paciente...
>
>   ListaABP$RecordID[i] <- outcomes$RecordID[i];
>   ListaABP$SAPS.I[i] <- outcomes$SAPS.I[i];
>   ListaABP$SOFA[i] <- outcomes$SOFA[i];
>   ListaABP$Survival[i] <- outcomes$Survival[i];
>   ListaABP$In.hospital_death[i] <- outcomes$In.hospital_death[i];
>
>   # Parameter == 'NISysBP'
>   #seta_NISysABP <- seta[seta$RecordID == ids[i] & seta$Parameter ==
> 'NISysABP' , c('RecordID','Value')] ;
>   seta_NISysABP <- seta[seta$RecordID == ids[i] & seta$Parameter ==
> 'NISysABP' , 'Value'] ; #Creo que esto ya no sería un dataframe, por lo que
> en la siguiente línea puede dar error
>   ListaABP$NISysABP_Min[i] <- min(seta_NISysABP);
>   ListaABP$NISysABP_Max[i] <- max(seta_NISysABP);
>   ListaABP$NISysABP_Mean[i] <- mean(seta_NISysABP);
>
>   # Parameter == 'NIDiasABP'
>   #seta_NIDiasABP <- seta[seta$RecordID == ids[i] & seta$Parameter ==
> 'NIDiasABP' , c('Time','Value')] ; #En este caso la forma de hacer el min
> sería ...min(seta_NIDiasABP$Value);
>   seta_NIDiasABP <- seta[seta$RecordID == ids[i] & seta$Parameter ==
> 'NIDiasABP' , 'Value'] ;
>   ListaABP$NIDiasABP_Min[i] <- min(seta_NIDiasABP);
>   ListaABP$NIDiasABP_Max[i] <- max(seta_NIDiasABP);
>   ListaABP$NIDiasABP_Mean[i] <- mean(seta_NIDiasABP);
>
>   # Parameter == 'NIMAP'
>   #seta_NIMAP <- seta[seta$RecordID == ids[i] & seta$Parameter == 'NIMAP' ,
> c('Time','Value')] ;
>   seta_NIMAP <- seta[seta$RecordID == ids[i] & seta$Parameter == 'NIMAP' ,
> 'Value'] ;
>   ListaABP$NIMAP_Min[i] <- min(seta_NIMAP);
>   ListaABP$NIMAP_Max[i] <- max(seta_NIMAP);
>   ListaABP$NIMAP_Mean[i] <- mean(seta_NIMAP);
>
> }#for i
>
> Tabla <- data.frame(ListaABP);
> #+++++++++++++++++++++++++++++++++++++++++++++++++
>
> Este código tardaba 3 horas en ejecutarse. La solución que me han propuesto
> es usar data.table en lugar de data.frame y ahora tarda 1 segundo
> aproximadamente en ejecutarse y es este:
>
> #-------------
> library(data.table)
> datSet <- fread("Set-A.csv")
> resOut <- datSet[, .(ValMax=max(Value), ValMin=min(Value),
> ValAvg=mean(Value)), by=c("RecordID","Parameter")]
> resOut$RecordID <- as.factor(resOut$RecordID)
> setkey(resOut, RecordID)
> head(datSet)
> datOutcome <- fread("Outcomes-A.csv")
> datOutcome$RecordID <- as.factor(datOutcome$RecordID)
> setkey(datOutcome, RecordID)
> head(datOutcome)
> #resEnd <- merge(resOut, datOutcome, by="RecordID", all=TRUE,
> allow.cartesian=FALSE)
> resEnd <- resOut[datOutcome]
> head(resEnd)
> setkey(resEnd, Parameter)
> #Ejemplo para conseguir uno o varios parametros.
> myRes <- resEnd[c("NISysABP","NIDiasABP","NIMAP")]
> head(myRes)
> #--------------
>
> Tengo una pregunta, data.table es lo más eficiente para procesar grandes
> cantidades de datos?, es fácil de manejar si quieres realizar cálculos
> complejos además de reorganizar tablas...??
>
> Gracias
> Un saludo
>
> 	[[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>


-- 
Nota: las tildes se han omitido para evitar conflictos con algunos lectores
de correo.

Frases notables:
* SATYÂT NÂSTI PARO DHARMAH (No hay religion mas elevada que la verdad)
* La oscuridad no se combate, se ilumina ...
* Un economista es un experto que sabrá mañana por qué las cosas que predijo
ayer no han sucedido hoy (Laurence Peter).



Más información sobre la lista de distribución R-help-es