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