Joan Giménez Verdugo
2016-Jul-28 16:07 UTC
[R-es] Eliminar filas al principio y final de un .csv en R
Muchas gracias Carlos, la lógica es perfecta pero no se como identificar con código las lineas en blanco entre el bloque 2 y el bloque 3. Para de esta forma quedarme solo con el bloque 2. Tienes alguna idea? Muchas gracias. Joan 2016-07-28 17:00 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>:> Hola, > > Se me ocurre esta solución en pseudo-código...: > > > 1. Coges el primer fichero para procesar. > 2. Con read.table indicas que salte esas primeras 20 líneas. Hay un > parámetro que permite hacer esto (skip). > 3. Cargas todo el fichero restante. > 4. Identificas el data.frame donde están esas líneas en blanco que > separan el segundo del tercer bloque. > 5. Borras todo lo que está por debajo de esas líneas, quedándote ya > con el bloque dos. > 6. Guardo en un data.frame temporal el bloque dos. > 7. Vuelvo al principio cogiendo otro fichero y aplicando la misma > lógica y al llegar al punto 6 añado al data.frame temporal el nuevo segundo > bloque. > > Si trabajas sobre Linux/Mac puedes hacer todo esto en una shell, con algo > como "awk". Saltas las primeras 20 líneas en blanco, lees las líneas > siguientes del fichero hasta que te encuentras una línea en blanco, donde > paras el bucle y guardas en un fichero el bloque dos. Vuelves a iterar en > el bucle y al encontrar nuevamente la línea en blanco, salvas (añadiendo) > las líneas en el fichero anterior. > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > > > El 28 de julio de 2016, 13:53, Joan Giménez Verdugo <joan.gimenez en csic.es> > escribió: > >> Hola a todos, >> >> tengo 170 .csv donde tengo que eliminar las primeras 20 lineas (primer >> bloque) y luego todo un último bloque de datos (tercer bloque) que está >> separado por dos filas sin datos del segundo bloque (que es el que me >> interesa). El tercer bloque empieza en cada .csv en una linea diferente >> por >> lo tanto no se si puedo automatizar en R quedarme tan solo con la >> información a partir de la linea 21 y luego solo hasta la siguiente linea >> en blanco que es donde empieza el tercer bloque (que será diferente en >> cada >> .csv). >> >> Muchas gracias de antemano. >> >> Joan >> >> -- >> *Joan Giménez Verdugo* >> *PhD Student* *Severo Ochoa* >> Estación Biológica de Doñana (EBD-CSIC) >> Department of Conservation Biology >> Americo Vespucio Ave, s/n >> 41092 Sevilla (Spain) >> www.ebd.csic.es >> --- >> Research Gate: Joan Giménez >> <https://www.researchgate.net/profile/Joan_Gimenez2> >> Phone: +34 619 176 849 >> ü Please consider the environment before printing this E-mail >> >> [[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 >-- *Joan Giménez Verdugo* *PhD Student* *Severo Ochoa* Estación Biológica de Doñana (EBD-CSIC) Department of Conservation Biology Americo Vespucio Ave, s/n 41092 Sevilla (Spain) www.ebd.csic.es --- Research Gate: Joan Giménez <https://www.researchgate.net/profile/Joan_Gimenez2> Phone: +34 619 176 849 ü Please consider the environment before printing this E-mail [[alternative HTML version deleted]]
Carlos Ortega
2016-Jul-28 16:53 UTC
[R-es] Eliminar filas al principio y final de un .csv en R
Hola, Esta es una forma: #--------------------------- df <- data.frame( x = c(1:10, NA, NA, 11:20), y = c(letters[1:10], NA, NA, letters[11:20] ) ) df first_bad <- which(is.na(df), arr.ind = TRUE)[1,1] sub_df <- df[1:(first_bad - 1), ] #--------------------------- En este ejemplo, ya se parte de la eliminación de las 20 primeras líneas. Por tanto el bloque segundo, es el que aparece entre la primera línea y la primera línea en la que aparecen los NAs (fila 11). Detecto que la fila 11 es la que tiene los NAs (el resultado está en "first_bad"). Y teniendo esto, selecciono un subconjunto del "df" (donde estaba todo, bloque dos y el tres), entre la primera fila y "first_bad". Saludos, Carlos Ortega www.qualityexcellence.es El 28 de julio de 2016, 18:07, Joan Giménez Verdugo <joan.gimenez en csic.es> escribió:> Muchas gracias Carlos, > > la lógica es perfecta pero no se como identificar con código las lineas en > blanco entre el bloque 2 y el bloque 3. Para de esta forma quedarme solo > con el bloque 2. > > Tienes alguna idea? > > Muchas gracias. > > Joan > > 2016-07-28 17:00 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>: > >> Hola, >> >> Se me ocurre esta solución en pseudo-código...: >> >> >> 1. Coges el primer fichero para procesar. >> 2. Con read.table indicas que salte esas primeras 20 líneas. Hay un >> parámetro que permite hacer esto (skip). >> 3. Cargas todo el fichero restante. >> 4. Identificas el data.frame donde están esas líneas en blanco que >> separan el segundo del tercer bloque. >> 5. Borras todo lo que está por debajo de esas líneas, quedándote ya >> con el bloque dos. >> 6. Guardo en un data.frame temporal el bloque dos. >> 7. Vuelvo al principio cogiendo otro fichero y aplicando la misma >> lógica y al llegar al punto 6 añado al data.frame temporal el nuevo segundo >> bloque. >> >> Si trabajas sobre Linux/Mac puedes hacer todo esto en una shell, con algo >> como "awk". Saltas las primeras 20 líneas en blanco, lees las líneas >> siguientes del fichero hasta que te encuentras una línea en blanco, donde >> paras el bucle y guardas en un fichero el bloque dos. Vuelves a iterar en >> el bucle y al encontrar nuevamente la línea en blanco, salvas (añadiendo) >> las líneas en el fichero anterior. >> >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> >> >> El 28 de julio de 2016, 13:53, Joan Giménez Verdugo <joan.gimenez en csic.es >> > escribió: >> >>> Hola a todos, >>> >>> tengo 170 .csv donde tengo que eliminar las primeras 20 lineas (primer >>> bloque) y luego todo un último bloque de datos (tercer bloque) que está >>> separado por dos filas sin datos del segundo bloque (que es el que me >>> interesa). El tercer bloque empieza en cada .csv en una linea diferente >>> por >>> lo tanto no se si puedo automatizar en R quedarme tan solo con la >>> información a partir de la linea 21 y luego solo hasta la siguiente linea >>> en blanco que es donde empieza el tercer bloque (que será diferente en >>> cada >>> .csv). >>> >>> Muchas gracias de antemano. >>> >>> Joan >>> >>> -- >>> *Joan Giménez Verdugo* >>> *PhD Student* *Severo Ochoa* >>> Estación Biológica de Doñana (EBD-CSIC) >>> Department of Conservation Biology >>> Americo Vespucio Ave, s/n >>> 41092 Sevilla (Spain) >>> www.ebd.csic.es >>> --- >>> Research Gate: Joan Giménez >>> <https://www.researchgate.net/profile/Joan_Gimenez2> >>> Phone: +34 619 176 849 >>> ü Please consider the environment before printing this E-mail >>> >>> [[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 >> > > > > -- > *Joan Giménez Verdugo* > *PhD Student* *Severo Ochoa* > Estación Biológica de Doñana (EBD-CSIC) > Department of Conservation Biology > Americo Vespucio Ave, s/n > 41092 Sevilla (Spain) > www.ebd.csic.es > --- > Research Gate: Joan Giménez > <https://www.researchgate.net/profile/Joan_Gimenez2> > Phone: +34 619 176 849 > ü Please consider the environment before printing this E-mail > > >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
Joan Giménez Verdugo
2016-Jul-28 19:40 UTC
[R-es] Eliminar filas al principio y final de un .csv en R
Muchas gracias Carlos. funciona de maravilla. He hecho un bucle y ya tengo todos mis dataframes listos en un momento. El bucle me ha quedado de la siguiente manera: #Cargar datos setwd("path") #hago una lista de todos los ficheros que quiero transformar csv<-list.files("path") #Bucle para hacerlo especie por especie for(i in 1:length(csv)) { print(i) # Me quito las primeras 24 lineas que no me interesan y relleno con NA el resto de huecos mydata <- read.table(file=paste("path",csv[i], sep=""), header=F, sep=",", skip=24,fill=T, na.stringsc("999", "NA", " ", "")) #encuentro donde está el primer NA first_bad <- which(is.na(mydata), arr.ind = TRUE)[1,1] #me quedo con los datos hasta el primer NA sub_df <- mydata[1:(first_bad - 1), ] #Guardo el csv nuevo write.table(sub_df, file =paste("path", csv[i], sep=""), sep = ",", na = "NA", dec = ".", col.names = F, row.names=F) } 2016-07-28 18:53 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>:> Hola, > > Esta es una forma: > > #--------------------------- > > df <- data.frame( > x = c(1:10, NA, NA, 11:20), > y = c(letters[1:10], NA, NA, letters[11:20] ) > ) > df > > first_bad <- which(is.na(df), arr.ind = TRUE)[1,1] > sub_df <- df[1:(first_bad - 1), ] > > #--------------------------- > > En este ejemplo, ya se parte de la eliminación de las 20 primeras líneas. > > Por tanto el bloque segundo, es el que aparece entre la primera línea y la > primera línea en la que aparecen los NAs (fila 11). Detecto que la fila 11 > es la que tiene los NAs (el resultado está en "first_bad"). Y teniendo > esto, selecciono un subconjunto del "df" (donde estaba todo, bloque dos y > el tres), entre la primera fila y "first_bad". > > > Saludos, > Carlos Ortega > www.qualityexcellence.es > > El 28 de julio de 2016, 18:07, Joan Giménez Verdugo <joan.gimenez en csic.es> > escribió: > >> Muchas gracias Carlos, >> >> la lógica es perfecta pero no se como identificar con código las lineas >> en blanco entre el bloque 2 y el bloque 3. Para de esta forma quedarme solo >> con el bloque 2. >> >> Tienes alguna idea? >> >> Muchas gracias. >> >> Joan >> >> 2016-07-28 17:00 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>: >> >>> Hola, >>> >>> Se me ocurre esta solución en pseudo-código...: >>> >>> >>> 1. Coges el primer fichero para procesar. >>> 2. Con read.table indicas que salte esas primeras 20 líneas. Hay un >>> parámetro que permite hacer esto (skip). >>> 3. Cargas todo el fichero restante. >>> 4. Identificas el data.frame donde están esas líneas en blanco que >>> separan el segundo del tercer bloque. >>> 5. Borras todo lo que está por debajo de esas líneas, quedándote ya >>> con el bloque dos. >>> 6. Guardo en un data.frame temporal el bloque dos. >>> 7. Vuelvo al principio cogiendo otro fichero y aplicando la misma >>> lógica y al llegar al punto 6 añado al data.frame temporal el nuevo segundo >>> bloque. >>> >>> Si trabajas sobre Linux/Mac puedes hacer todo esto en una shell, con >>> algo como "awk". Saltas las primeras 20 líneas en blanco, lees las líneas >>> siguientes del fichero hasta que te encuentras una línea en blanco, donde >>> paras el bucle y guardas en un fichero el bloque dos. Vuelves a iterar en >>> el bucle y al encontrar nuevamente la línea en blanco, salvas (añadiendo) >>> las líneas en el fichero anterior. >>> >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> >>> >>> El 28 de julio de 2016, 13:53, Joan Giménez Verdugo < >>> joan.gimenez en csic.es> escribió: >>> >>>> Hola a todos, >>>> >>>> tengo 170 .csv donde tengo que eliminar las primeras 20 lineas (primer >>>> bloque) y luego todo un último bloque de datos (tercer bloque) que está >>>> separado por dos filas sin datos del segundo bloque (que es el que me >>>> interesa). El tercer bloque empieza en cada .csv en una linea diferente >>>> por >>>> lo tanto no se si puedo automatizar en R quedarme tan solo con la >>>> información a partir de la linea 21 y luego solo hasta la siguiente >>>> linea >>>> en blanco que es donde empieza el tercer bloque (que será diferente en >>>> cada >>>> .csv). >>>> >>>> Muchas gracias de antemano. >>>> >>>> Joan >>>> >>>> -- >>>> *Joan Giménez Verdugo* >>>> *PhD Student* *Severo Ochoa* >>>> Estación Biológica de Doñana (EBD-CSIC) >>>> Department of Conservation Biology >>>> Americo Vespucio Ave, s/n >>>> 41092 Sevilla (Spain) >>>> www.ebd.csic.es >>>> --- >>>> Research Gate: Joan Giménez >>>> <https://www.researchgate.net/profile/Joan_Gimenez2> >>>> Phone: +34 619 176 849 >>>> ü Please consider the environment before printing this E-mail >>>> >>>> [[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 >>> >> >> >> >> -- >> *Joan Giménez Verdugo* >> *PhD Student* *Severo Ochoa* >> Estación Biológica de Doñana (EBD-CSIC) >> Department of Conservation Biology >> Americo Vespucio Ave, s/n >> 41092 Sevilla (Spain) >> www.ebd.csic.es >> --- >> Research Gate: Joan Giménez >> <https://www.researchgate.net/profile/Joan_Gimenez2> >> Phone: +34 619 176 849 >> ü Please consider the environment before printing this E-mail >> >> >> > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es >-- *Joan Giménez Verdugo* *PhD Student* *Severo Ochoa* Estación Biológica de Doñana (EBD-CSIC) Department of Conservation Biology Americo Vespucio Ave, s/n 41092 Sevilla (Spain) www.ebd.csic.es --- Research Gate: Joan Giménez <https://www.researchgate.net/profile/Joan_Gimenez2> Phone: +34 619 176 849 ü Please consider the environment before printing this E-mail [[alternative HTML version deleted]]