[MUSIC] Es importante que sepas, antes de que comiences esta lección, que los datos a los que haremos referencia son tipos de datos tabulares, es decir, que están organizados en archivos por renglones y columnas. [SOUND] En esta lección lo que aprenderemos a hacer es a escribir y a leer datos, comenzaremos por leer datos. Esta es una de las operaciones más importantes porque generalmente nos dan datos en forma de archivos y si tenemos suerte estos serán archivos de texto. Por supuesto no todos los datos que nos proporcionan o que estemos generando, van a ser escritos en archivos de texto. Estos pueden venir como archivos en formato de excel, o algún otro formato de alguna hoja de cálculo. También pueden ser conexiones a base de datos o, incluso, podemos estar extrayendo información del web, you sea vÃa alguna interfaz de aplicación o páginas web directamente que tenemos, a las cuales tenemos que limpiarles estos datos. Hay algunas funciones dentro del sistema base de R que nos servirán para leer datos. Estas están enfocadas a datos que están escritos en archivos de texto, no los formatos, que hemos hablado como Excel o conexiones a base de datos o datos que provienen del web. Estas son las más importantes, las que están listadas en pantalla, pero además nos enfocaremos por este momento en read.table y read.csv. Asà como hay funciones para leer datos en R, también hay funciones en el sistema base para escribirlos. Estas funciones aparecen ahorita en pantalla y, de nuevo, estaremos enfocando nuestros esfuerzos en aprender los detalles de la función write.table. Comenzaremos con la función read.table para aprender cómo leer datos en R. Read.table es una de las funciones más importantes para leer datos en el sistema. Es importante saber que, además, otras funciones para leer datos de archivos de texto, en realidad son funciones con parámetros you preestablecidos de la función read.table. Por ejemplo la función read.csv, read.csv2, read.fortran y read.socket son formas especializadas de read.table que you tienen parámetros preestablecidos. Volviendo con nuestra función read.table, podemos observar que los parámetros más importantes de esta función son: file, header, sep, colClasses, nrows, comment.char, skip y stringsAsFactors. La función read.table es muy eficiente con archivos pequeños porque al ser estos archivos pequeños, puede hacer toda la revisión del archivo, de manera rápida y eficiente. El problema comienza cuando los archivos son muy grandes, en ese caso tenemos que empezar a utilizar los parámetros para mejorar tal vez el rendimiento de la lectura. Por defecto, la función read.table ignorará todas las lÃneas que contengan este signo. Averiguará además, cuántos renglones tenemos. Y, finalmente, averiguará de qué tipo es cada columna de las variables que va encontrando, que es justo lo que sucede cuando mandamos a llamar la función de esta manera. Ahora, con los archivos grandes debemos ser cuidadosos, porque muchas veces una mala lectura o un mal parámetro pasado a la función read.table podrÃa generar esperas muy largas, por ejemplo. Yo les sugiero no leer ningún archivo de datos si estos archivos son más grandes del tamaño de la memoria ram que tiene disponible o, también, recuerden utilizar el parámetro comment.char="", es decir, no hay ningún tipo de comentario, sà en el archivo no existe ningún comentario asà ese chequeo no se hace en cada lÃnea que se va leyendo. Es importante también que no olviden que aunque estamos tratando de revisar algunos de los parámetros más importantes de las funciones que vemos en el curso. También ustedes pueden ir a revisar el manual de la página de ayuda de cada una de las funciones, en este caso de read.table porque les dará una mejor visión de todos los parámetros que pueden ser controlados con esta función. Ahora vamos a ver algunos consejos para la función read.table uno de los primeros consejos que les darÃa es utilizar el parámetro col.Classes. Este parámetro lo que recibe es, en un vector, cada uno de los tipos que van a observar de cada una de las columnas, cuando estén leyendo esos valores con la función read.table. ¿Esto por qué es de ayuda? Pues porque si tuviéramos digamos tres tipos diferentes en un archivo, lo que harÃamos es ir leyendo cada uno. Más bien lo que hace el sistema es ir leyendo cada uno de ellos y al final decidir, de qué tipo es conforme a lo que ha observado en cada columna. Pero si nosotros le decimos a priori que lo que va a ver, por ejemplo, fuera una columna de puros nombres, otra de puras edades, y otra de puras categorÃas, entonces no tiene que hacer ese chequeo en cada una de las lecturas de los renglones, y podrÃa hacerlo de manera más rápida. Podemos averiguar la clase de las columnas de manera fácil cuando tenemos archivos grandes. Lo que podemos hacer, como en este ejemplo que estamos observando en pantalla, es leer solamente los primeros cien renglones de nuestro archivo y utilizar la función sapply initial, o sea el nombre de nuestro objeto, y la clase. Lo que está haciendo es aplicar la función class a cada una de las columnas del objeto inicial. Entonces, este objeto lo guardamos en el vector clases, y luego leemos you entonces todo el archivo pero pasándole el parámetro col.classes. Otro consejo que les puedo dar es utilizar nrows desde el principio. Nrows le dirÃa a la función read.table a priori cuantos renglones va a leer. Es por eso que nos ayudará a poder establecer el tamaño de memoria que vamos a utilizar desde el principio y no ir ampliando ese tamaño de memoria conforme vamos leyendo el archivo. Es claro, sólo de ver la función read.table y cómo puede llegar a complicarse leer un archivo de datos, que es importante saber qué tipo de sistema tienes. ¿Esto que significa? Pues que debemos aprender antes de empezar a utilizar el sistema, qué tamaño es la memoria ram, qué aplicaciones se pueden estar usando al mismo tiempo en ella, si el sistema es multiusuario. Cuántos usuarios podrÃa llegar a haber al mismo tiempo. Qué tipo de sistema operativo estamos utilizando. Y si es de 32 o 64 bits. Ahora supongamos que nos dicen que nos van a dar un millón de registros de usuarios del censo por ejemplo. Y que han recabado, 100 datos de cada uno de esos usuarios del censo. Cómo podrÃamos calcular el tamaño posible de ese archivo o de esos datos que van a ocupar en memoria. Pues es muy simple. Lo único que tenemos que hacer a sabiendas de que hay 1 millón de renglones en ese archivo, y hay 100 columnas. Tenemos que multiplicar esas columnas, también suponiendo que van a ser numéricas, por 8 bytes cada una, y eso nos darÃa el tamaño aproximado, Del archivo que vamos a tener, en este caso serÃan aproximadamente unos 700, 800 megabytes. Una recomendación que es empÃrica pero que funciona, es que generalmente es importante tener el doble de memoria RAM de los datos que vas a estar cargando en el sistema. [NOISE] La función write.table es muy parecida a la función read.table. Esta también tiene sus formas especializadas como read.csv, read.fortran, read.csv2, etcétera, etcétera. Estas van a ser utilizadas a más detalle en la práctica. Finalmente para terminar esta lección veremos las funciones para escribir objetos que you tenemos en el sistema en un momento dado utilizando las funciones dump y la función source para leerlos. En este ejemplo, podemos observar que tenemos dos objetos, X y Y. Utilizando la función dump, lo escribimos a un archivo llamado datos.r. Posteriormente, borramos esos dos objetos, pero si utilizamos la función source para leer de nuevo ese archivo que acabamos de crear, llamado datos.R, podemos observar que si volvemos a llamar a esos objetos, siguen estando en memoria. Bueno, haciendo un repaso final de esta lección, podemos recordar que las dos funciones más importantes para leer y escribir datos son read.table y write.table. Estas tienen muchos parámetros y es importante conocer nuestro sistema para poder saber qué parámetros debemos utilizar, para que cuando estemos leyendo datos de archivos muy grandes, nuestro rendimiento de esta lectura sea bastante bueno. Espero, puedan llevar a cabo estas lecturas y escrituras de sus datos en la práctica. [MUSIC]