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]]
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).
Hola Mª Luz, ¿A qué tipo de cálculos complejos te refieres?. Con data.table puedes definir operaciones (con la complejidad que quieras) para un conjunto de filas, agrupándolas por columnas y más... Su sintaxis es muy compacta pero a poco que la utilizas acabas encontrando la forma de hacer las cosas sin muchos pasos intermedios. Pero puedes hacerlo menos compacto y quizás más comprensible. Y sobre la eficiencia de data.table comparándolo con otras alternativas aquí viene una comparativa: http://stackoverflow.com/questions/4322219/whats-the-fastest-way-to-merge-join-data-frames-in-r Aunque desde la aparición de dplyr, la duda aparece sobre si es más conveniente data.table o dplyr. Aquí hay otro hilo que los compara, teniendo en cuenta diferentes atributos: http://stackoverflow.com/questions/21435339/data-table-vs-dplyr-can-one-do-something-well-the-other-cant-or-does-poorly/27718317#27718317 ¿Qué volúmen de datos quieres procesar? Y...¿quieres algo más rápido que menos de un segundo?... Saludos, Carlos Ortega www.qualityexcellence.es El 29 de mayo de 2015, 15:50, MªLuz Morales <mlzmrls en gmail.com> escribió:> 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 >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Hola Carlos, bueno la verdad es que mi pregunta era algo general, cuando no has usado data.table no parece muy intuitivo pasar de la forma de programar a la que estás más acostumbrado (bucles, notación matricial...) a esa otra. Aun no tengo un cálculo complejo concreto pero lo tendré que hacer... solo quería saber si se puede, y parece que sí, asi que será cuestión de empaparse un poco de data.tables Tendré que usar en un futuro próximo grandes cantidades de datos, GB...con plataforma como hadoop para Big data, para ello data.table tb parece funcionar verdad? Gracias por los enlaces con las comparativas, son muy útiles Un saludo MªLuz Universidad Europea de Madrid El 30 de mayo de 2015, 0:45, Carlos Ortega <cof en qualityexcellence.es> escribió:> Hola Mª Luz, > > ¿A qué tipo de cálculos complejos te refieres?. > > Con data.table puedes definir operaciones (con la complejidad que quieras) > para un conjunto de filas, agrupándolas por columnas y más... Su sintaxis > es muy compacta pero a poco que la utilizas acabas encontrando la forma de > hacer las cosas sin muchos pasos intermedios. Pero puedes hacerlo menos > compacto y quizás más comprensible. > > Y sobre la eficiencia de data.table comparándolo con otras alternativas > aquí viene una comparativa: > > http://stackoverflow.com/questions/4322219/whats-the-fastest-way-to-merge-join-data-frames-in-r > > Aunque desde la aparición de dplyr, la duda aparece sobre si es más > conveniente data.table o dplyr. > Aquí hay otro hilo que los compara, teniendo en cuenta diferentes > atributos: > > > http://stackoverflow.com/questions/21435339/data-table-vs-dplyr-can-one-do-something-well-the-other-cant-or-does-poorly/27718317#27718317 > > ¿Qué volúmen de datos quieres procesar? > Y...¿quieres algo más rápido que menos de un segundo?... > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > > El 29 de mayo de 2015, 15:50, MªLuz Morales <mlzmrls en gmail.com> escribió: > >> 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 >> > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >[[alternative HTML version deleted]]