[R-es] Mi script R es muy lento

MªLuz Morales mlzmrls en gmail.com
Vie Mayo 29 15:50:56 CEST 2015


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]]



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