[R-es] Eliminar filas al principio y final de un .csv en R

Joan Giménez Verdugo joan.gimenez en csic.es
Jue Jul 28 21:40:54 CEST 2016


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.strings=
c("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]]



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