Skip to content
Prev 10220 / 15379 Next

[R-es] buscar y reemplazar tabs dentro de un archivo

Hola,

Además de la solución de modificar el fichero antes de procesarlo en R
usando comando Unix/Linux del sistema, puedes probar a hacerlo todo en "R"
con otras funciones de lectura de otros paquetes.

Mira este ejemplo:

En un fichero "Myfile.txt" tengo las siguientes líneas con algunas
"trampas":

#---------------
DeployID Date.Time LocationQuality Latitude Longitude
STM05-1        2005/02/28 17:35 Good -35.562 177.158
STM05-1   2005/02/28 19:44 Good -35.487 177.129
STM05-1 2005/02/28 23:01 Unknown -35.399 177.064
STM05-1 2005/03/01               07:28 Unknown -34.978 177.268
STM05-1 2005/03/01 18:06 Poor -34.799 177.027
STM05-1 2005/03/01 18:47 Poor -34.85 177.059
STM05-2 2005/02/28 12:49 Good -35.928 177.328
STM05-2 2005/02/28 21:23 Poor -35.926 177.314
#---------------


   - En la segunda línea entre SMT05-1 y 2005... hay varios espacios y
   varios tabuladores.
   - En la tercera línea entre STM05-1 y 2005, hay dos tabuladores
   - En la quinta línea entre la fecha y 07:28 hay dos/tres tabuladores...


Mira lo que son capaces de hacer estas funciones:
V1         V2    V3      V4      V5      V6
1: STM05-1 2005/02/28 17:35    Good -35.562 177.158
2: STM05-1 2005/02/28 19:44    Good -35.487 177.129
3: STM05-1 2005/02/28 23:01 Unknown -35.399 177.064
4: STM05-1 2005/03/01 07:28 Unknown -34.978 177.268
5: STM05-1 2005/03/01 18:06    Poor -34.799 177.027
6: STM05-1 2005/03/01 18:47    Poor -34.850 177.059
7: STM05-2 2005/02/28 12:49    Good -35.928 177.328
8: STM05-2 2005/02/28 21:23    Poor -35.926 177.314
Warning message:
In fread("Myfile.txt") :
  Starting data input on line 2 and discarding line 1 because it has too
few or too many items to be column names or data: DeployID Date.Time
LocationQuality Latitude Longitude
DeployID Date.Time LocationQuality Latitude Longitude
1   STM05-1        2005/02/28 17:35 Good -35.562 177.158
2        STM05-1   2005/02/28 19:44 Good -35.487 177.129
3       STM05-1 2005/02/28 23:01 Unknown -35.399 177.064
4 STM05-1 2005/03/01               07:28 Unknown -34.978
5          STM05-1 2005/03/01 18:06 Poor -34.799 177.027
6           STM05-1 2005/03/01 18:47 Poor -34.85 177.059
7          STM05-2 2005/02/28 12:49 Good -35.928 177.328
8          STM05-2 2005/02/28 21:23 Poor -35.926 177.314


La función "fread()" del paquete data.table avisa de un posible error con
la cabecera, pero ignora todas las trampas que hemos puesto y crea las
columnas donde corresponde. Y como cabecera pone directamente "V1",
"V2",....
Mientras que "read_table" ni avisa, e incluye la cabecera y las líneas con
las trampas.

La solución "fread()" puede servirte tal cual. Mientras que read_table
podría ayudarte pero exigiría que luego la salida como data.frame la
post-procesaras...

Cuidado con "fread()" que la salida es un data.table y data.frame.
Mi consejo sería que a la salida de fread() la convirtieras a un data.frame
puro con "as.data.frame()" para no tener problemas. Salvo que el resto de
tu código lo quieras hacer con la sintaxis de data.table.

Gracias,
Carlos Ortega
www.qualityexcellence.es



El 18 de mayo de 2016, 10:02, eric <ericconchamunoz en gmail.com> escribió: