Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estadística con R
Week 1
Instalación de Herramientas.
Presentación del Curso
video: Bienvenida
https://d3c33hcgiwev3.cloudfront.net/2ae9bdAuEeWTMw4udNdVLQ.processed/full/36
0p/index.mp4?Expires=1567123200&Signature=Jvg2ToQ0rMnKSaHFYwXuf4CyfQeyJlz
IdGkwYoo5ViRHDkCi6tDErSyrcn1TMNJYM6PizsBazgfqjCKdRAHnvMk5lZACs-y~am0h
wvTnRRhsL~6EdDJDYHOXmcYCy~h7UUqq8-twv0IF2lPV4V1VDm75srn89L0jmhqvE0l
QN5M_&Key-Pair-Id=APKAJLTNE6QMUY6HBC5A
La programación estadística no es más que las t areas que se requiere llevar a cabo. Para
poder obtener información y llevar a cabo inferencias con los datos cuantitativos, por
medio de herramientas computacionales.
Además de que utilizaremos una herramienta conocida como R Studio, que es el ambiente
de desarrollo principalmente utilizado por los programadores estadísticos.
Este no es un curso de estadística. Pero si tienes nociones de ella o si has tomado un
curso antes, será suficiente para que puedas seguir el paso del curso.
Te preguntarás cómo avanzaremos en este curso.
Nos enfocaremos primero en aprender los básicos del lenguaje de programación R.
Luego aprenderemos los distintos tipos de datos que hay en el lenguaje.
Y finalmente, comenzaremos a escribir nuestros primeros programas o scripts en él.
Después haremos perfilado de tus programas y además con esto aprenderás a mejorar
el desempeño de ellos. Notarás que no seremos demasiado minuciosos en los detalles del
lenguaje.
Un aspecto importante y que quiero que tengan en cuenta es que, aprender a programar
no es una tarea que puedes hacer en en un par de semanas, o en un mes o en un año. Es
una habilidad que se va adquiriendo a través de los años.
Les recomiendo mucho leer un artículo de Peter Norvig, que se llama Enséñate a programar
durante diez años http://loro.sourceforge.net/notes/21-dias.html
Básicamente lo que indica es que la habilidad de la programación es algo que tienes que ir
cultivando. Y que cometiendo errores además, puedes ir aumentando tu habilidad para
lograrlo. Espero que lo disfrute.
Instalación de R en Windows XP
Instalación de R en Mac OS X
Bibliografía
En este vídeo repasaremos un poco la bibliografía que nos podría ser útil, es importante
hacer notar que este curso no está basado en un libro en particular, pero hemos encontrado
que los siguientes títulos son de mucha utilidad.
En principio el libro de Peter Dalgaard, "Introductory Statistics with R", es muy bonito
porque nos da una introducción al lenguaje R, además de un acercamiento a muchísimos
conceptos de estadística.
Luego también tenemos el libro de Norman Matloff "El arte de la programación en R" o
"The Art of R Programming", es una referencia muy, muy importante.
Además también del libro de Joseph Adler, "R in a Nutshell", que prácticamente es la
biblia. Donde se ve a muchísimo detalle cómo está creado el lenguaje R.
Y también tenemos el libro de Winston Chang, "The R Graphics Cookbook", que nos da
una visión general de las capacidades gráficas del lenguaje R. Y finalmente el libro de Paul
Teetor, llamado R Cookbook, que nos enseña a hacer algunas tareas que son muy, muy
comunes en el manejo y la manipulación de los datos.
Introducción al Lenguaje
https://d3c33hcgiwev3.cloudfront.net/WXE20tXKEeWjTxJlqDdk5Q.processed/full/360p/index
.mp4?Expires=1567123200&Signature=Nk6OdzcGP2xp61uM8JH1dtfTqaRFt9~BAD7AKndd
k-lhpM0pWayD8IG6S0BR~KjHlX1YJgDL1Wl-58vWB0xu0zmi8EzB8GskOAyamiM9fJerwhxs
ve54CdxYmvdRlZHC6Vikhe2FKxM9AZLUDhmzVq2igPTisn0mU~~MKPkwlow_&Key-Pair-Id
=APKAJLTNE6QMUY6HBC5A
R en pocas palabras no es más que un dialecto del lenguaje S. S fue un lenguaje que fue
desarrollado por John Chambers en los laboratorios Bell durante los 70s. Este fue
pensado como un ambiente para el análisis estadístico dentro de la compañía. Es decir, que
inicialmente se implementó como una serie de bibliotecas de Fortran. Un lenguaje muy
utilizado durante los 70s. Y además las primeras versiones del lenguaje no contenían
funciones para análisis estadístico.
El sistema fue re escrito en los 80s en el lenguaje de programación C. Esto con el objetivo
de que fuera portable. Y es entonces que también en estos años Chambers y Hastie
documentan en el famoso libro, Statistical Models in S, la funcionalidad, del lenguaje para
el análisis estadístico. Porque ya estaba tomando completa forma.
En los años 90s sale la versión 4, que es más o menos la versión que nosotros conocemos
hoy en día. Y además aparece el libro Programming with Data de John Chambers. Y en
este se detallan las minucias del lenguaje.
El lenguaje S entonces ya proveía un acceso relativamente simple a una gran variedad de
técnicas estadísticas. Además, que para los usuarios avanzados, les permitía escribir
funciones por medio de un lenguaje de programación ya bien definido. Con el que podían
añadir nuevas técnicas por medio de la definición de estas. Como podemos ver, el
desarrollo de S y S-PLUS fue generado en este ambiente comercial.
Quizá, motivados por esta razón, en 1991, Ross Ihaka y Robert Gentleman deciden
implementar su propia versión de S, ellos la bautizaron como R.
Tan bien, lograron hacer esto que para 1993 ponen R al público general. Esto tuvo tanto
éxito, que para 1995 liberaron el código bajo una licencia GNU. La liberación del lenguaje
tuvo tanta popularidad, que para 1996, se formaron por primera vez las listas de correo o de
distribución de información llamadas R-help y R-devel. En estas se discutían temas
relacionados con ayuda hacia el lenguaje. Y por el otro lado, el desarrollo del propio
lenguaje.
Las características del lenguaje R son muchísimas, y la mayoría de estas son tomadas
como ventajas del mismo lenguaje. La principal y que es la razón por la cual fue adoptada
ampliamente, es que su sintaxis es muy similar al lenguaje S. La semántica también es
muy parecida al lenguaje S.
https://laingenieria.info/questions/395/cual-es-la-diferencia-entre-sintaxis-y-semantica
Además recordemos que tenemos un modo interactivo que sirve más que nada para probar
ideas. Pero una vez que hemos probado estas se pueden implementar en scripts o
programas mucho más grandes para hacer nuevas herramientas.
Otra de las grandes ventajas es que tenemos una comunidad muy grande y estimulante y
muy activa. Esto en las listas R-help y R-devel y en el sitio web Stack Overflow. Además
es gratis. Y es software libre.
Es entonces que ahora quisiera hablarles qué significa que tenga las cuatro libertades
básicas del software libre.
Estas son, la libertad para ejecutar el programa, que eso prácticamente cualquier software
nos lo da.
Luego viene una de las más importantes que es la libertad de acceder al código fuente.
¿Esto por qué es importante? Porque podemos obtener conocimiento de ese código.
Finalmente, tenemos las dos últimas libertades que son las que hacen fuerte a la licencia
GNU. Y esta es que podemos redistribuir nuestros cambios o el mismo software que
obtenemos. Y finalmente los cambios que nosotros hacemos o mejoras pueden también ser
distribuidas a la comunidad entera.
La funcionalidad además, está basada en sus usuarios, ¿esto qué significa? Significa
que si tú quieres un nuevo análisis, un nuevo modelo o algún tipo de tecnología nueva que
quisieras probar. Dependes, ya sea de la comunidad de usuarios para que se genere o
tendrías que escribirlo tú mismo.
Otro de los grandes problemas es que la mayoría de los objetos, o las variables que
estamos usando en el sistema. Tienen que estar cargadas completamente en la memoria
RAM. Por lo que las computadoras que tienen poca memoria pueden llegar a tener
problemas. Además de que no es un sistema que es ideal para todo.
No hay bala de plata tanto en los análisis estadísticos como en la programación en sí.
Por lo cual R probablemente pertenece a un nicho muy pequeño todavía.
Es también importante que hablemos del diseño del lenguaje. En principio hay un
sistema base que contiene toda la funcionalidad del lenguaje y además ciertos
paquetes. Que nos permiten poder manipular algunos datos y algunos métodos que nos
van a servir.
Encima de este sistema base tenemos paquetes que son recomendados. Generalmente
son funciones que son muy utilizadas en general para casi cualquier tipo de de
análisis estadístico. Y además, fuera de estos paquetes recomendados, existen más de
7000 paquetes que están contribuidos por la comunidad de usuarios de R. Y que suben
todos los días algún paquete nuevo o mantienen estos en el sitio CRAN.
Si quisiéramos convencer a alguien de por qué usarlo. Le podríamos decir que tiene
muchas funciones estadísticas. Además de que podemos implementar de manera
rápida procedimientos estadísticos y gráficos.
Estos gráficos son muy buenos y están basados en el sistema base del lenguaje. Y los
gráficos avanzados se pueden conseguir utilizando paquetes como ggplot2.
Finalmente una cosa que a mí me parece maravillosa es que los autores de los paquetes
pueden ser contactados directamente. Generalmente son personas que están dispuestas a
ayudarte.
Ustedes se preguntarán, ¿quién está detrás de R? Hay un grupo desde 1997, como ya
vimos en la historia, que mantiene el core del lenguaje que es conocido como el R
Development Core Team. Este es financiado por la R Foundation que es una
organización basada en Viena, sin fines de lucro.
Y estos son los cinco documentos básicos para poder tener, toda la documentación de R a
la mano.
● Este es la introducción a R.
● Cómo escribir extensiones en R.
● Cómo importar y exportar datos en R.
● Cómo instalar y administrar un sistema donde más usuarios van a utilizar R.
● Y finalmente toda la implementación de los internos del lenguaje.
https://d3c33hcgiwev3.cloudfront.net/cRMsA9XKEeWbSgqxBCBhEw.processed/full/360p/in
dex.mp4?Expires=1567209600&Signature=HTIC6MEuHoHx0OFH~tZjUJQkVFr9lQknt5e1m
ANwtJbqoymj5bonQgal6TrrC5SFuinAovrTcdBVkI2bGn-PUASZJm5dGfNkQUg5epH1Ogcw0
qJz6i6TuOs-AmcWTidMXOUU5dRKedCw9jz6A0bza2A~puEPzX4fP1tmv6zeSlc_&Key-Pair-
Id=APKAJLTNE6QMUY6HBC5A
En R es muy fácil obtener ayuda, el lenguaje y la línea de comandos, viene con un sistema
integrado de ayuda. Y podemos obtener ayuda en el sistema.
En caso de que no podamos entender qué es lo que nos está explicando el sistema
de ayuda. Podemos entonces generalmente preguntar con alguien que ya sepa. O ir a las
listas de distribución de correo donde podemos hacer nuestra pregunta y obtener alguna
respuesta por ahí.
Otra gran ayuda que podemos tener en el web es utilizando el sitio Stackoverflow.
Donde podemos encontrar una gran cantidad de preguntas ya hechas y respondidas.
Incluso están rankeadas por la calidad de las preguntas y la calidad de las respuestas.
En este caso no observamos cual es toda la salida de help(). Porque cuando nosotros
tecleamos en la consola help("read.table"). Esto lo que va a hacer es que la ayuda se
despliegue en la ventana de ayuda de RStudio.
Una vez que suceda eso, podemos entonces ver que la página del manual o de la ayuda
de read.table al final siempre tiene ejemplos. Estos ejemplos, en caso de que tengamos
una duda para poder resolver rápidamente. Podemos utilizar entonces solamente la
función example(), ponemos también el nombre de la función.
En esta otra captura de pantalla, lo que estamos viendo es la función library(), poniendo
como parámetro help, library(help="grDevices"), library(help="e1071")
Si nosotros sabemos el tipo de ayuda que estamos buscando, podemos buscar esa ayuda
directamente desde la biblioteca que estamos utilizando. En este caso grDevices es un
paquete del sistema base. Y entonces cuando llamamos al library help igual al nombre del
paquete grDevices. Lo que hace es que nos manda igual está documentación en una
página aparte de RStudio.
Otra opción que tienes es preguntar a alguien con más experiencia. O finalmente,
cuando seas un usuario muy a vanzado, leer el código fuente de las funciones y ver si
hacen exactamente lo que estás buscando. Es importante que hagas una revisión del
manual antes de hacer una pregunta. Porque si no estarás haciendo perder el tiempo a los
usuarios que resuelven este tipo de problemas.
Además, debes poner bien en contexto el tipo de pregunta que estás haciendo. Puedes
incluir al hacer tu pregunta los pasos para resolver el problema. Qué salida estás
esperando, qué salida está recibiendo, las versiones de R que estás usando del
sistema operativo. O cualquier otra información adicional que pudiera poner en contexto a
los demás usuarios.
Por ejemplo, si vas a hacer preguntas en una lista de correo, crea un encabezado o
subject en el correo que sea preciso. Por ejemplo, no hagas algún tipo de encabezado
que no tenga mucho sentido. Por ejemplo, el primero que tenemos aquí en pantalla:
"Auxilio!!!,no puedo ajustar un modelo". Eso no dice absolutamente nada, y cuando esto
aparezca en la red y esté indexado, no se entenderá. Por ejemplo puedes hacer entonces
una modificación al encabezado y hacerlo de manera más inteligente.
En este caso puedes poner "R 3.2.2 función lm() produce un seg fault con un data frame
muy grande". Esto, es mucho más preciso, aunque todavía es un poco ambiguo, porque hay
otra información que no está presente.
En este caso puedes ser un poco más inteligente y utilizar el siguiente encabezado. Que es
"R 3.2.2 la función lm() en Mac OS versión 10.10.4, genera un seg fault con un data frame
muy grande". Esto es completamente preciso y hará que incluso, cuando alguien tenga la
misma duda pueda encontrarla rápidamente la respuesta. Cuando busques en las listas
de correo, busca el objetivo, no los pasos. Porque muchas veces los pasos que pudieras
estar haciendo pudieran ser incorrectos. Y podrías a veces también tener pasos diferentes
para llegar al mismo punto.
Además, también puedes hacer búsquedas explícitas de la pregunta. Ésto te puede ayudar
si las personas que han hecho preguntas anteriormente, hicieron los encabezados de
manera inteligente. Acuérdate siempre que, cuando posteés una pregunta, proveas un
mínimo de información necesaria. Finalmente, si encuentras la respuesta, no olvides
postearla. Para que cuando alguien más tenga una duda exactamente igual a la tuya,
la pueda encontrar rápidamente.
Cuando preguntas en una lista, no llegues diciendo primero que encontraste un error o un
bug. Es raro, muy muy raro que en los programadores entreguen un producto o un paquete
con errores. Ellos han testeado mucho tiempo sus paquetes tratando de que no aparezcan
con errores. Por lo cual es muy difícil que tú pudieras encontrar uno. Otra cosa que es
también importante es que. Como estas personas están ocupadas haciendo sus trabajos
diarios, no deberías preguntar para que te resuelvan la tarea.
No preguntes en las mismas listas al mismo tiempo. Porque esto lo que genera es
duplicación de la información en el tráfico que se está generando en estas listas. Y entonces
también podría molestar a algunos usuarios. Mis últimas recomendaciones para obtener
ayuda es que te suscribas inmediatamente a la lista de distribución de R en español.
Que se conoce como r-help-es@r-project.org.
Una vez que estés subscrito, también puedes tener acceso al listado en la página web. Que
es la que está apareciendo en pantalla. Y finalmente, recuerda leer el listado de tips sobre
cómo hacer preguntas inteligentes.
Para introducir datos desde la propia ventana de comandos se utiliza la función scan():
> scan()
1: 1
2: 2
3: 3
4:
Read 3 items
[1] 1 2 3
Como vemos, cuando queremos dejar de introducir datos, pulsamos un ENTER de más.
1: pepe
2: paco
3: pipo
Read 3 items
> nombres
Read 9 items
> datos
[1] 1 2 3 0 1 2 4 5 6
Observemos que hemos puesto sep="," para indicar que los datos vienen separados por comas.
> datos
[1,] 1 2 3
[2,] 0 1 2
[3,] 4 5 6
Lectura de tablas desde ficheros
Supongamos que tenemos un fichero llamado edadaltura.txt, y que queremos leerlo con una
sola función.
> datos
edad altura
paco 20 174
pepe 22 180
kiko 19 170
> colnames(datos)
> rownames(datos)
Si deseamos especificar que la primera fila contiene los nombres de las variables
pondremos header=T.
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ", row.names = TRUE, col.names =
TRUE)
> x<-c(1,2,3,4,5)
> write(x,"c:\\cursoada\\x.txt")
Si lo que queremos es escribir una matriz con este procedimiento, hay que ser más cuidadosos.
> x<-matrix(1:9,ncol=3,byrow=T)
>x
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> write(t(x),"c:\\cursoada\\x.txt",ncol=ncol(x))
La función write() actúa escribiendo una columna de la matriz cada vez, por lo que
Para enviar los resultados de tu práctica, al final de ésta deberás utilizar tu correo
electrónico de registro en Coursera y generar el código (token). Para más información
consulta el apartado "Cómo enviar" que encontrarás en esta misma página
OBJETOS Y TIPOS DE DATOS.
https://d3c33hcgiwev3.cloudfront.net/HBkaydAmEeWcuAr30b9I0w.processed/full/360
p/index.mp4?Expires=1567123200&Signature=gyqOrbBfo4TCrAS373y0nIWwSFvOydU
WY7MF5eEAJg8qZ2Bf3HEdJeWWkXo9reKDVLw7hhnM~3xH7uUv-GkzPZwc-wC8TW3
MV0UJ3H-qSO8xiXN3jQjOolZ-uDvT5zCb8DybzYgBsXFWogptNkzcfdDDnWjPU3ndrhV
WnUzYB5Y_&Key-Pair-Id=APKAJLTNE6QMUY6HBC5A
En esta lección aprenderemos los tipos de datos que hay en el lenguaje, además de las
operaciones básicas que podemos hacer con estos tipos.
Hay varios tipos de objetos en R, uno de los primeros son los objetos del lenguaje: que
estos pueden ser llamadas a funciones, expresiones, o nombres de llamadas o de
objetos.
También están las expresiones que son un conjunto de expresiones correctas que
todavía no han sido evaluadas y finalmente están las funciones que constan de una lista de
argumentos y código del cuerpo de ellas y el entorno en que están siendo ejecutadas.
R cuándo lo utilizas por primera vez puede parecer una calculadora común y corriente
porque puedes llevar a cabo todas las operaciones aritméticas que puedes hacer con una
calculadora. Y además de esto también puedes hacer operaciones lógicas.
El vector es el objeto mas simple en R, es por eso que las operaciones generalmente están
basadas en ese objeto mínimo, una de las primeras operaciones que puedes querer hacer
con los elementos de un vector, es seleccionar uno de esos elementos, además puedes
manipular los valores que no están presentes o valores perdidos y podemos ordenar
esos vectores.
Tenemos operaciones que podemos llevar a cabo con conjuntos, también podemos tener
operaciones para llevar a cabo secuencias determinísticas o aleatorias.
En R casi todo es un objeto incluyendo las funciones y las estructuras de datos, para
ver que objetos tenemos en un momento determinado lo que podemos usar es la función
ls().
La lista se puede ver cómo un vector de objetos de diferentes clases. Puedes crear objetos
de tipo vector, con la función vector().
https://d3c33hcgiwev3.cloudfront.net/jYYxA9XKEeWjTxJlqDdk5Q.processed/full/360p/index.
mp4?Expires=1567123200&Signature=d1FBkQnoAV77YJLAbUJAiF~dejVmw4EL-YfatNtloH
Ix8MudgncmPwsscPefLvlG7cbrtV-tJsyWpnAXEURL9gWNxxsUcXmO3FNWSGC7gj2TS6e7
RqsQZMof3PgEtvJcqin-MdzHXowTmxEIdwUOYfDmQqIlh0xSvCtH3J1pu~0_&Key-Pair-Id=
APKAJLTNE6QMUY6HBC5A
Otra característica que pueden tener los objetos en R son los atributos. Estos pueden ser
de diferentes tipos. Pueden ser nombres, dimensiones, clase, el tamaño, o incluso
algunos atributos definidos por el usuario.
Estos se pueden acceder, o puedes ver qué atributos tiene un objeto utilizando la función
attributes(). Y poniendo entre paréntesis el nombre del objeto.
Aquí es justo como se pueden generar las variables u objetos de los que ya hemos hablado.
la gramática del lenguaje determina si una expresión está completa o no. Y solo podemos
saber si esta fue correcta una vez que hemos presionado Enter.
Finalmente, es importante que sepamos que con el símbolo de gato # podemos hacer
comentarios al código que estuviéramos escribiendo. ya dijimos que cuando escribimos una
expresión en la línea de comandos y presionamos Enter, esta se evalúa y el resultado no se
regresaba.
En este ejemplo que estamos viendo en pantalla, el [1] nos está indicando el tamaño del
vector que estamos mandando a llamar. Es de tamaño 1, por lo que podemos ver que el 9
es el primer elemento de ese vector, que es el único que existe en él.
En este caso por ejemplo, tenemos que x se le fue asignado un valor del 1 al 100. O sea, se
genera un vector de tamaño 100, donde cada uno de ellos van incrementándose de uno en
uno. El símbolo dos puntos, indica que lo que queremos es una secuencia del 1 al 100.
Esto lo habíamos dicho anteriormente, pero no habíamos visto cómo funciona. Podemos ver
en la pantalla que podemos crear vectores numéricos, lógicos, de caracteres, enteros y
complejos. En este caso, como podemos darnos cuenta, cada uno de los elementos cuando
estamos creando estos vectores, son iguales, del mismo tipo.
Cuando utilizamos la función vector(), tenemos que decir qué tipo de vector va a ser, el
tipo de dato que va a contener y el tamaño. Si no especificamos explícitamente los
elementos, lo que hará es rellenar de ceros ese vector.
Te preguntarás probablemente qué pasa si combinas dos tipos distintos utilizando la función
c(). Lo que sucede aquí es que no se genera un error, sino se lleva a cabo un tipo de
operación conocida como coerción. En donde se busca un tipo común, y los elementos
que no son de ese tipo son convertidos a él para poder generar un vector.
Recordemos que el vector tiene elementos todos del mismo tipo. Por ejemplo, lo que
estamos haciendo es utilizando la función c, asignar un par de valores o concatenarlos al
vector y.
y<-c(1.7, “a”)
El primer elemento que estamos tratando de concatenar es el valor numérico 1.7, el
segundo es el carácter “a”. Como “a” en R no puede ser convertido a un valor numérico,
entonces el 1.7, el valor numérico 1.7, es convertido al carácter “1.7”. Que no es más que la
representación en carácter del valor 1.7.
Y como su nombre lo indica lo que hacen es convertir lo que le estás poniendo de entrada,
a el tipo que tiene en la segunda parte de su nombre. En este ejemplo, el vector x es un
vector que cuenta los valores del 0 al 10, con incrementos de uno en uno.
x<-0:10.
Si observamos utilizando la función class(), la clase a la que pertenece x, podemos ver que
es de tipo entero. Ahora podemos crear cuatro vectores más, llamados a, b, c y d. Donde a
cada uno vamos haciendo una coerción explícita como numérico, como lógico, como
carácter y como entero.
a<-as.numeric(x)
b<-as.logical(x)
c<-as.character(x)
d<-as.integer(x)
Entonces si ahora observamos el tipo de cada una de ellas, vamos a observar que
justamente lo que queríamos. Uno es numérico, otro es lógico, otro es de carácter y el otro
es entero.
Pudiera suceder que quisiéramos intentar coaccionar un vector a un tipo donde puede
resultar algo que no tiene sentido. Por ejemplo, ¿qué pasaría si intentamos coaccionar
caracteres de letras a un vector de tipo lógico? Lo que nos va a suceder en este caso muy
particular. Es que estos caracteres como no pueden ser interpretados como valores
verdadero o falso, true or false. Lo que hará es generarnos valores NAs. NA es un tipo muy
particular que significa Not Available. Es decir, es un valor faltante.
video:Matrices
https://d3c33hcgiwev3.cloudfront.net/nkryVNXKEeWjTxJlqDdk5Q.processed/full/360p/index.
mp4?Expires=1567123200&Signature=kbdPAioGni9II8lqz5~Mg-33LwP3UZUEGyBCKGy6lH
o2wfV49IACnHOLqV~yCJZkCJw2DmlFbRiqbMkBzz1FxEiIdYXwKmDoD0t~zPfKkxY8-Qjhah
lNoJGfRwNLYgnzSh1g1Tcyy6KmWK5DB87LnVC2QrybDWFB-cheHsm5XfA_&Key-Pair-Id=
APKAJLTNE6QMUY6HBC5A
Nuestro siguiente tipo de objeto que vamos a aprender es las matrices. Las matrices son
un tipo de vector particular. No son más que un vector con un atributo especial, llamado
dimensión.
Un hecho que es importante a tener en cuenta con las matrices en R, es que éstas se van
rellenando columna a columna, de izquierda a derecha. Contrario a cómo se rellenan los
arreglos por ejemplo en C. Que generalmente se rellenan de renglón en renglón de
izquierda a derecha. Es importante saber esto porque cuando queramos convertir un vector
a una matriz, tenemos que tener en cuenta cómo se va a ir rellenando los elementos de
esta matriz.
https://d3c33hcgiwev3.cloudfront.net/CJIPutAnEeWcuAr30b9I0w.processed/full/360p/i
ndex.mp4?Expires=1567123200&Signature=WyOyPDVJrIP-Ap9SXf7aMRKZq8G~sTpp
WMF3htCupj13jjNq3wBOAPooIaAksEObm0WGzQg-GvL2bbbAzqc4l1S~c4iav6eaCb23
a2VM27lD2h271RGTh246yTtjkY4Usd-DT6dFHnyfjsNHyupw8eYMIdhVCK0~RueXoXrLF
4E_&Key-Pair-Id=APKAJLTNE6QMUY6HBC5A
En esta lección aprenderemos lo que son las reglas de precedencia y las operaciones
vectoriales. Si retomamos el tema de las operaciones básicas al principio del curso.
Podemos recordar que existen todas las que se puedan llevarse a cabo en una calculadora
científica. Que éstas pueden ser binarias, como la suma o resta, multiplicación, división, la
operación módulo, la exponenciación o la división entera.
O también unarias, como el negativo o lógicas, como el and o "y lógico". Que se utiliza el
operador ampersand. Y o el "o lógico", que es la barrita o doble barra.
También hay operadores de orden, que son mayor que, menor que, menor o igual, mayor o
igual, o igual. Y de comparación, que es igual o distinto.
Como el vector es un elemento básico del lenguaje, es natural entonces pensar que se
pueden definir operaciones sobre ellos. Que hagan la lectura del código más conciso, fácil
de leer y además más eficiente. Éste tipo de operaciones se conoce como operaciones
vectoriales. Estas operaciones se definen para hacernos a la idea de que las operaciones
normales pueden llevarse a cabo de manera paralela.
En este ejemplo tenemos dos vectores que tienen el mismo tamaño, o el mismo número de
elementos. Si sumamos uno con el otro, la suma se va definiendo, es decir, la suma
vectorial; se va definiendo operador elemento a elemento. Es decir, el vector 07, 08, 09, 10;
se suma el 09,10, 11, 12; uno a uno. Es decir, que cuando nos regresa el resultado, nos da
16, 18, 20 y 22.
Ésto es complicado, porque nos haría el código mucho más largo, y además mucho más
lento. Porque iría haciendo la operación de suma paso por paso. En el caso de las
operaciones vectoriales, podemos pensar que todas las sumas de todos los elementos
están llevándose a cabo al mismo tiempo. Aunque internamente puede suceder que ésto no
esté pasando.
También podemos llevar a cabo operaciones vectoriales con matrices. ¿Ésto que
significa?, si tenemos dos matrices con el mismo atributo de dimensión. Entonces éstas
pueden sumarse, multiplicarse, dividirse y restarse, elemento a elemento utilizando la
operación que queramos.
https://d3c33hcgiwev3.cloudfront.net/05huSNmIEeWaQgoI1qH58w.processed/full/360p/inde
x.mp4?Expires=1567123200&Signature=emYu4ZOLK1JahVJdoyTF~I2mCE~icgMtEX1TOT
dHOPFNSj71dBV4mdb9K6aBKA2UGJZA78sQoaF7x9~98HM0kHfrLNkYmkW5VPXoNUmc
u7luXhxbPlJO9jtpM95YiOK3Kn709Gp0heoD~vc0SSqEkO-LcIxe04trLdc7iBDpUbA_&Key-P
air-Id=APKAJLTNE6QMUY6HBC5A
Ahora aprenderemos cómo manejar las fechas y los tiempos en R, estas tienen clases
especiales dentro del sistema y nos permiten llevar a cabo operaciones numéricas y
estadísticas con ellas. Manejar fechas y tiempos en R puede ser bastante sutil, además de
que la coerción explícita, se puede hacer de distintas maneras, es por eso que es
importante saber que hay diferentes tipos, tanto para datos de fechas como para datos de
tiempo.
Hay dos tipos de datos que vamos a estudiar para el tiempo en R, uno de ellos es
POSIXct, en esté el tiempo es el número de segundos desde el 1ero de Enero de 1970,
cualquier fecha posterior a está se representara con un numero positivo y cualquier fecha
o tiempo anterior, será representada con un numero negativo.
Estos datos nos muestran el orden en que aparecen los elementos de un vector (lista) que
es de tipo POSIXlt, el otro tipo de dato para tiempo en R.
Una de las grandes dificultades para los tipos de datos de tiempo en R es que la manera en
que se representa internamente es muy diferente a cómo se imprimen en pantalla, esto
puede hacer que las conversiones puedan llegar a ser complejas.
Para obtener el tiempo actual podemos usar la función Sys.time(), está la podemos guardar
en un objeto y podemos ver que el objeto usando la función typeof(), es de tipo double,
pero cuándo imprimimos el objeto tal cual, el objeto se imprime cómo una cadena de texto
con la fecha y la hora actual.
Usando las funciones as.POSIXct() y as.POSIXlt() se puede convertir el valor de tiempo en
diferentes formatos.
Por ejemplo utilizando la función as.POSIXlt() del objeto que acabamos de crear con la
función Sys.time() podemos ver que al imprimirla nos da igual la misma cadena, pero si
pedimos el typeof() cómo es de tipo POSIXlt, es de tipo lista, podemos tratar de acceder a
los nombres de la lista con la función names(), pero estos son nulos porque en la definición
de esté formato no existen no existen los nombres para está, pero podemos acceder a los
elementos de la lista usando el operador [ [ ] ].
Si tuviéramos un tipo de dato de tiempo y quisieramos convertirlo a cadena de tal manera
que pudiéramos guardar esa cadena en un archivo, tenemos que utilizar la función
strftime() esta recibe como primer parámetro un objeto de tipo tiempo ya sea POSIXct o
POSIXlt y luego la descripción de la cadena que queremos generar, en el ejemplo se usa
una notación con % seguido de una letra que define ya sea: el año, mes, día, hora, minutos
y segundos.
Una vez que tengamos dos objetos de tipo tiempo podemos llevar a cabo operaciones entre
ellos, por ejemplo la diferencia en dias o segundos entre dos tiempos.
Adicionalmente a los dos tipos de datos observados, también tenemos el tipo de dato Date
que se refiere a fechas, la unica diferencia entre esté y los de tiempo, es que en esté se
toman diferencias en dias y no en segundos, cómo sucede con POSIXct o POSIXlt, es esté
caso podriamos convertir una cadena de caracteres a un tipo Date, usando la función
as.Date().
Podemos utlilizar el parámetro origin pasandole a ese parámetro una cadena con una
fecha para definir una fecha de origen y a partir de ahi podemos llevar a cabo operaciones
entre objetos que son del mismo tipo Date.
Una función muy útil en R para manejar las fechas es la función format() está recibe un
objeto de tipo fecha o tiempo y cómo segundo parámetro podemos pasarle el formato en
que queremos que nos regrese la cadena que queremos formar.
Finalmente podemos llevar a cabo operaciones o comparaciones entre distintos objetos de
tipo Date, una vez que estos están en el formato interno de R, por ejemplo la comparacion >
y <, tiene sentido cuándo comparas un par de fechas.
video: Listas, Factores, Valores Faltantes y Dataframes
https://d3c33hcgiwev3.cloudfront.net/lvcA-tAnEeWGUwp-0F6aaQ.processed/full/360p/index.
mp4?Expires=1567123200&Signature=bSWC399ZWtK~U5UouarFNy6SY46-L6Yd9UX2-aZ
FhjbLZh41ehxNNyG8c5alLfbyyIPnlDUY0DAqMeVuKvfF089c4w4uIZYOnuvGeT7gDuyk4Tou
eqN0nfODxbxFPz4hGqRwWffYBglu80g9rE~WDsEUc0z0w6Yq~mox1lqibLw_&Key-Pair-Id=
APKAJLTNE6QMUY6HBC5A
Otro de los objetos que son importantes en R son las listas. Las listas no son más que
vectores, que ahora sí, pueden contener distintos tipos de datos en él.
Este tipo de objeto es muy especial porque nos permite tener y llevar a cabo operaciones
que podrían ser complicadas si no existiera.
Imagen
Pueden observar que en la función lista list() recibe los elementos que van a formar parte
de esta lista y lo asigna al objeto x.
Los factores son un tipo especial de vectores, estos nos sirven para representar datos
categóricos.Puede haber de tipo ordenado o sin orden. Uno puede pensar en ellos como si
fuera un vector de enteros, donde cada entero está asignado a una etiqueta en particular.
Como no pusimos explícitamente que tiene que ir en un orden. No aparece primero y y
es
aparece en segundo.
Otra cosa muy bonita de este tipo de dato es que, si utilizamos la función table(), lo que
hace es nos tabula cada uno de los factores y la frecuencia con la que está
apareciendo en el vector que estamos observando.
Con la función unclass(), en este caso, lo estamos usando solamente de manera ilustrativa
para mostrar que a cada uno de los factores o de los niveles que estamos teniendo,
va asociado un número entero.
Es decir, nosotros podríamos tener entonces un vector de puros valores enteros que van
asociados a una etiqueta, en este caso, las palabras yes Y no. El orden de los niveles se
puede establecer dentro de la función factor(), utilizando el parámetro level. Éste no es
más que un vector indicando el orden en el que van a ir.
En este ejemplo utilizamos ahora, en vez de las respuestas en inglés yes y no. Ahora
utilizamos las palabras si y no, y establecemos que sí va primero, y no, va en segundo
lugar. Al mandar a llamar el vector de factores, podemos observar que ahora sí, aparece en
primer lugar, y no, aparece en el segundo lugar.
Cuando hay un valor que está faltante, se utiliza un valor particular para rellenar ese valor
faltante y, esto se indica con el carácter NA, o NaN, dependiendo del tipo de valor que esté
faltando. NA significa not available y N
aN es not a number, que ya vimos como podemos
también generar un valor de este tipo.
Los valores NA también tienen una clase, hay enteros NA, caracteres NA. Pero es
importante acordarse que un valor NaN es al mismo tiempo un NA, pero no al contrario.
Por ejemplo, el vector X tiene un valor NA. Si probamos con la función is.na(), podemos ver
que en el lugar número tres donde teníamos un NA dice TRUE, es decir, que ese valor sí es
un NA. Pero si probamos si es un NaA, con la función is.nan(), podemos ver que el valor
tres no es un na, por eso le pone FALSE.
En la segunda asignación del vector X, podemos ver que el elemento número tres es un
NaN y el elemento número cuatro es un NA. Y si hacemos la pregunta de si es NA, ambos
van a ser verdaderos. Por lo cual, justamente estamos comprobando lo que dijimos, que un
valor NaN puede ser al mismo tiempo un NA, pero no al contrario.
Los dataframes se representan en R como una lista muy particular, donde cada uno de los
elementos de la lista tienen el mismo tamaño. Cada uno de estos elementos se puede
ver como una columna, y la longitud de cada elemento es el número de renglones que
se tiene. La forma tabular de los dataframes les puede recordar una matriz, pero
recordemos que la matriz es un tipo particular de vector. Es decir, que tiene la limitante que
todos los elementos de la matriz tienen que ser del mismo tipo o clase. Mientras que en un
dataframe. Eso no es necesario, como es una especie de lista cada uno de los elementos
de la lista, es decir, cada una de las columnas puede tener un tipo distinto o una clase
distinta.
Un atributo particular de los dataframes, es que cada una de las columnas puede tener un
nombre, al igual que cada uno de los renglones. Y estos son conocidos como row.names y
col.names.
Ahora, ¿cómo generamos un dataframe? Es muy fácil, hay varias maneras, una es usando
la función data.frame(). La segunda es utilizando las funciones read.csv() o read.table()
que lo que hacen es leer de un archivo o de una conexión.
A un archivo los datos, y los va metiendo de manera tabular, y también podemos convertir
una matriz a un dataframe utilizando la función data.matrix().
En este ejemplo podemos ver como formar un dataframe utilizado la función data.frame().
La función recibe separado por comas. Primero el nombre de la columna que vamos a
utilizar y luego un signo =, y seguido de los elementos que van a llenar esa columna. En
este caso tenemos dos columnas, columna una que son los valores del uno, dos, tres y
cuatro, y la columna dos que tiene los valores TRUE, TRUE, TRUE y FALSE. Podemos
preguntar por los renglones, el número de renglones y el número de columnas, usando la
funciones nrow(x) y ncol(x), al objeto que es ese dataframe. Que en este caso se llama X.
Y finalmente una cosa que es importante recordar, es que el tamaño de cada una de las
columnas tiene que ser el mismo. Por ejemplo, en el error que estamos viendo al final,
estamos tratando de meter primero en la columna uno, cinco elementos. Y en la columna
dos, que desde cuatro elementos, entonces cuando intentamos generar un dataframe con
eso, nos dice que hay un error porque hay un número diferente de renglones.
Podemos poner nombres a los objetos. Los nombres no son más que un tributo que nos
permite describir de manera perfecta de qué trata un renglón o una columna. Podemos
poner nombres a las listas, a las matrices y, también, a los dataframes. Podemos ver en
este ejemplo que tenemos el vector x, que consta de los elementos 11, 12, 13, 14. Podemos
ponerle nombre a cada uno de estos utilizando la función names() y modificándola con una
asignación de un vector que tiene cada uno de los nombres de cada elemento como un
carácter.
Si en el segundo ejemplo, lo que estamos generando es una lista donde cada uno de los
elementos ya tienen un nombre, si mandamos a imprimir la lista, nos aparece que ahora
cada uno de los elementos tiene un símbolo de pesos y el nombre.
Como ya dije, las matrices también pueden tener nombres y podemos usar o asignar estos
nombres utilizando la función dimnames(), donde podemos ponerle nombres a cada una de
las dimensiones.
Ésto lo hacemos modificando ese atributo pasándole una lista o asignándole una lista a este
atributo. Donde cada uno de los elementos van a ser vectores de los tamaños de cada
dimensión de la matriz.
Hay generalmente tres operadores básicos para hacer una extracción de un
subconjunto de datos.
Y estos son los corchetes [] que extraen elementos de la misma clase al objeto (del)
que estás extrayendo.
Imagen
Una [ ] es pidiendo uno de los elementos, por el número del índice que estamos
buscando. Una cosa que es importante no olvidar es que los índices en R comienzan
desde el número uno, no desde el cero como en otros lenguajes.
Luego también podemos pasar una secuencia de números. Y entonces esta secuencia
de números, al pedirla por medio de corchetes nos va a regresar los elementos que
están en esa secuencia. Y finalmente podemos pasar también un vector lógico. Donde
nos va a regresar, al pedirlo por medio de corchetes, los lugares en donde el valor del
vector lógico sea igual a verdadero o TRUE.
Para hacer un subconjunto de datos de una matriz o lo que es lo mismo un subsetting de
matrices. Podemos usar los operadores con corchetes, pero recordemos que la matriz
tiene dos dimensiones. Que son los renglones y las columnas.
Entonces podemos mandar a llamar utilizando corchetes, el valor de un renglón y una
columna en específico, o el valor de una columna entera o de un renglón entero. Ésto
lo hacemos, no poniendo ningún elemento en primer lugar en el corchete, luego una
coma y luego el valor del renglón o la columna que queremos.
Por supuesto también podemos pedir varias columnas poniendo igual secuencias. O incluso
también vectores lógicos. Por ejemplo, en la imagen que estamos observando en pantalla,
podemos pedir una matriz que ya formamos. El elemento 1, 3 es decir, el renglón uno
columna tres. Pero por ejemplo, si pedimos el elemento 3, 1 que es al revés, como no
tenemos tres renglones, nos va a generar un error. Ésto porque el límite de los índices no
está dentro del que nosotros pedimos.
Los últimos dos ejemplos lo que estamos viendo es justamente eso. Pedimos el renglón
uno y nos da todo el renglón uno. Y en el segundo, pedimos la columna cuatro y nos da
exactamente la columna cuatro, que es el siete y el ocho.
Una cosa que es importante recordar, es que cuando pedimos un elemento de una matriz.
Ésta, este elemento regresado en forma de vector. Es decir, pierde su condición de matriz.
Pero si nosotros utilizamos el parámetro Drop = FALSE. Lo que hace R es regresarnos
también una matriz.
Pedimos igual, el mismo elemento 3, 4 pero el valor que nos está regresando ese subsetting
es una matriz que tiene un renglón y una columna, es decir, no ha perdido su condición de
matriz. Sólo para reafirmar lo que he dicho, vemos el mismo subsetting. Los valores uno,
seis, 11 y 16, de la misma matriz pero usando una el drop=FALSE. Y en el otro el valor por
default del parámetro drop que es igual a TRUE.Podemos observar que cuando le pedimos
la clase a uno de esos dos subsettings. Lo que estamos observando es que uno es de clase
entera y otro es de clase matriz.
Ahora, cómo extraemos elementos de una lista. O hacemos subsetting de listas. Podemos
usar tres formas. Una es usando los corchetes, la otra es usar los dobles corchetes y la
última es con el símbolo de pesos y el nombre que sólo puede utilizar nombres literales.
Cuando hemos nombrado a los elementos de nuestra lista. Como podemos ver aquí en el
ejemplo. Si mandamos a llamar, usando sólo corchetes podemos pasar de nuevo una
secuencia o valores también lógicos. O como en este caso, muy simple, un número de
índice. En este caso estamos pidiendo el índice número uno de la lista. Entonces lo único
que nos regresará, es la lista o hola, el elemento de esa lista que es hola. Es decir, los
números del uno al diez.
Sólo para reafirmar, si pasamos un único índice, un único número a los corchetes nos va
regresar el elemento con ese índice y su valor. Ésto en forma de lista, es lo que estamos
observando en pantalla.
Cuando usamos los dobles corchetes que es por ejemplo en el siguientes, que es x[[1]].
Nos regresa el primer elemento porque es el índice uno, de la lista que es ese vector. Ahora
pueden observar que ese vector tiene de forma su clase, es vector. Y finalmente podemos
observar también que si inferimos con el símbolo de pesos y el nombre de la variable literal,
nos regresa exactamente el mismo valor.
Ahora que pasa cuando utilizamos los dobles corchetes con el nombre literal. También nos
puede dar ese valor y nos lo regresa en forma de vector. Y finalmente si pedimos la variable
literal solamente con un corchete, nos va regresar ese elemento que pedimos, nombrado
como hola2 en este caso, pero si se dan cuenta podemos observar que ahora es de tipo
lista también.
Por ejemplo podemos notar que en la anotación que estamos observando en pantalla,
utilizando el operador corchete, podemos pasar un vector, este vector en este ejemplo, tiene
los elementos uno y tres. Si se lo pasamos al operador corchetes, nos va a extraer el
elemento uno y el tres de nuestra lista X. Que en este caso es dos, tres, cuatro, cinco, hasta
el siete y la palabra puente.
Ahora observemos que pasa con el operador de doble corchete. El operador doble
corchete, uno podría pensar que es similar al operador del signo de pesos. Pero en
realidad, en el fondo, no son tan similares. El operador de doble corchete puede utilizar
índices computados. Es decir, que nosotros podemos calcular o generar un índice y meterlo
al doble corchete y nos irá a extraer esos elementos que queremos.
En este caso, en la lista X, calculamos o generamos una variable llamada name cuyo único
elemento es una cadena llamada hola3 y si se lo ponemos al operador doble corchete, nos
regresa el elemento puente. En este caso si nosotros pasamos la variable name al operador
de signo de pesos no va funcionar.
Ahora veamos qué pasa, cuando queremos hacer subsetting de elementos anidados de una
lista. Para empezar, lo elementos anidados de una lista, significa que dentro de la lista
puede haber otra lista. Que es justamente la lista x que estamos observando en pantalla.
Que contiene una lista que tiene los elementos 10, 11 y 12. Y un vector que tiene los
elementos 9.8 y 2.33. Si quisiéramos tomar el valor 12, es decir, el tercer valor del primer
elemento de la lista X. Entonces lo que hacemos es pasarle únicamente el vector 1,3 entre
corchetes dobles.
Ahora si queremos utilizar otra notación que sea una notación equivalente. Es usar
corchetes, corchetes, uno, que significa ve y extráeme el elemento uno de la lista, que es
esa lista, 10, 11, 12. Y luego, otra vez dobles corchetes tres. Que lo que va a hacer es ir a
extraer el elemento tres de esa lista que ya se generó. El ejemplo de abajo no es más que
solamente la misma notación del primer ejemplo. Para ir a acceder el segundo elemento de
la lista, el primer elemento de ese vector que nos genera. supongamos que creamos una
lista que tenga como elemento,un único elemento que se llame mmmddd223s, es un
nombre arbitrario que se me ocurrió solamente para poder ejemplificar lo que vamos a
observar. Y este tiene los valores del uno al 35.
Generalmente vamos a encontrar valores faltantes o NA, que ya hemos observado qué
significan estos valores. Cuando nos encontramos con este tipo de valores, algunas
ocasiones vamos a querer eliminarlos y quedarnos sólo con los valores que sean diferentes
a NA.
El ejemplo que estamos observando, tenemos un vector que contiene NA. Lo que hacemos
es generar un vector de valores lógicos, utilizando la función is.na. En éste nos regresará
todo un vector que nos contenga los valores verdaderos, donde el elemento sea NA,
entonces si lo que queremos es justo lo contrario, entonces tenemos que negar ese vector.
Utilizando el operador signo de admiración. Entonces utilizando ese operador y el
operador corchetes, podemos pasarle al vector x ese operador y entonces nos regresará
sólo los elementos que son distintos de NA.
Esta función lo único que tenemos que hacer es generar con ella un vector lógico, y luego
mandar a llamar ese vector lógico, utilizando una operación de corchetes. El dataset
airquality, is se lo pasamos a la función complete.cases nos genera un vector lógico, esté
vector lógico entonces se lo podemos pasar a airquality de nuevo, utilizando la operador
corchetes para que nos de sólo los renglones donde los valores sean TRUE.Es decir,
quitándonos todos los valores NA que no necesitamos.
Tareas de programación: Lección de swirl: 3.
Subconjuntos de Datos
Escribir funciones es una de las bases de la programación y del análisis de datos,
esto es útil para esconder complejidad que muchas veces tiene que ser repetitiva,
es decir, nos facilita la elaboración de programas y el análisis.Para poder crear una
función necesitamos abrir RStudio, crear un nuevo script de R:
Después tenemos que definir qué hará la función, teóricamente se le conoce como:
Especificación de la función que es la descripción formal de las capacidades de la función y
la interacción con el usuario.
Guia para el estilo de código
Reyes de Jesús Luis rodolfo
Aprenderemos una guía para el estilo de código. Este es importante que puede ser que se tenga
que revisar tu código tiempo después, por tí o por alguien más y entonces el seguir esta guía te
permitirá tener un código más legible y por lo tanto perderás menos tiempo en tratar de re
entender lo que tú you habías escrito. Es por ello que vamos a establecer una serie de
estándares mínimos que la mayoría de la gente va a seguir y una vez que you estén utilizando
esos estándares mínimos, adopten algún estilo particular o inventen el propio para algún
proyecto en específico. Antes de continuar, no olvides que todos tus archivos de código en R
deben estar guardados en modo texto y con una codificación ASCII. Si vas a utilizar acentos o
algún carácter especial, es importante que guardes en el formato o codificación UTF-8. Esto se
puede cambiar en el menú de file de R En la parte que dice "Save with Encoding". Una vez que
le des clic ahí, te aparecerá una serie de codificaciones, y, te digo, utiliza el ASCII o UTF-8. La
primera recomendación que te podemos dar en esta guía es que inventes tu código.
Indentar no es más que colocar los espacios en blanco necesarios para hacer el código más
legible.
Puede incluso mostrar al lector el flujo del programa, sin necesidad de otra cosa.
un ejemplo sin indentar seria:
pone los comentario en la misma línea, más de una asignación en la misma línea, esto lo
vuelve más apretado y difícil de entender, pero si vemos este otro ejemplo, el código es más
entendible
cada comentario va en una línea, las asignaciones en diferentes, para saber que se asigna
a que y que datos recibe cada variable y la llave en otra parte.
Podemos cambiar la manera en como indentamos con la tecla tab o tabulador, es decir, cada
vez que utilizamos o presionamos la tecla tab o tabulador, podemos ver que nos inserta cierto
número de espacios en blanco. Podemos cambiar el comportamiento de la tecla tab en R
Studio, es decir, cuántos espacios inserta, yendo a la configuración de R Studio en la sección de
code
En la imagen con el
código podemos ver que los espacios están bien dados, haciendo más entendible y legible el
código para los demás.
si una función resulta demasiado larga es mejor simplificar para un mejor entendimiento a los
próximos programadores que la deseen ver, siguiendo con la filosofía unix, Donde cada
comando hace una única cosa, pero lo hace muy bien.
Conociendo bien esto podremos adoptar una manera de programar, incluyendo la manera en la
que nombras las funciones y modifcas las variables
un stilo muy utilizado es el google style
https://google.github.io/styleguide/Rguide.xml
https://docs.google.com/document/d/1C_iqJkBSed5KlNpC4m3Jh29tUiC6TsIxXm-Zn
XF3PuM/edit#heading=h.km843nkdz5jm
https://www.coursera.org/learn/intro-data-science-programacion-estadistica-r/lecture/
c3Qkv/funciones-apply-mapply-rep
FUNCIÓN MAPPLY.
dice cuántas veces se va a repetir cada uno de los elementos del primer vector.
Como pueden ver, la matriz Q es creada utilizando la función rep cuatro veces,
función mapply()
como primer parámetro va recibir a la función rep().
pero en este caso vamos a ir iterando sobre los elementos uno, dos,
El número de veces que queremos repetir cada uno de esos elementos del
vector anterior.
Esto lo que va hacer, es ir iterando uno por uno, cada uno de los elementos de los
vectores y aplicándoselo a la función rep. En este caso si utilizamos el vector 4:1, lo
que hará es repetir el número uno, cuatro veces. Luego el número dos, tres veces.
El número tres, dos veces. Y finalmente el número cuatro una única vez. Como esto
no puede ordenarse en una matriz, nos regresa una lista.
Parámetros en el Sistema de Gráficos
Presentación del curso
https://docs.google.com/document/d/1C_iqJkBSed5KlNpC4m3Jh29tUiC6TsIxXm
-ZnXF3PuM/edit?usp=sharing
A continuación revisaremos algunas funciones para hacer gráficas de alto nivel, es decir
gráficas preestablecidas que nos dicen cierta información sobre los datos que estamos
observando. Algunas que veremos serán gráficas de puntos, histogramas, densidades,
barras o de caja. Hoy en las primeras funciones de alto nivel que veremos es las gráficas de
histogramas.
Podemos crear histogramas utilizando la función hist, esta recibe un vector de valores
numéricos y lo que hace es nos grafica el histograma tal como lo haríamos punto por punto.
En caso de que no queramos que nos grafique frecuencias, lo que podemos utilizar es el
parámetro freq = false para que nos grafique probabilidades en vez de frecuencias.
Podemos cambiar el color de las barras de nuestro histograma utilizando un parámetro que
you utilizamos antes, col donde le pasamos como cadena el nombre del color que
queremos utilizar, en este caso estamos usando red, es decir rojo. Cuando lo utilizamos así
nos grafica el histograma de color rojo. También es posible cambiar el número de cajas que
queremos utilizar en nuestro histograma. Para eso utilizamos la función breaks, podemos
observar que dependiendo de las cajas que utilicemos el gráfico podría ser de una forma u
otra. Como el histograma no nos puede dar una visión mas o menos exacta de cómo se
están comportando nuestros datos, podemos utilizar un truco para graficar una densidad
encima del histograma y esto lo hacemos de la siguiente manera. En este código estamos
utilizando el procedimiento por fases del que you hemos hablado. Primero pintamos un
histograma y encima de él luego pintamos por medio de líneas los puntos que nos regresa
la función de NOR que esta función nos regresa los valores de la densidad de los datos que
estamos observando.
Esta línea la podemos pintar de color azul para que sea distinguida. Una manera más
efectiva de ver la densidad de unos datos es utilizando una gráfica de densidad por kernel.
Para esto tenemos que utilizar la función density. A la función density lo único que tenemos
que ponerle como parámetro de entrada es un vector numérico, como you lo hemos hecho
antes. Una vez que introducimos ese vector numérico y mandamos a llamar a la función,
esta nos regresará un ajuste a un kernel de manera no paramétrica.
Este regreso de la función density puede ser utilizada, entonces, por la función plot para
graficar justamente ese kernel. Un kernel no es más que una función que nos va
describiendo la distribución de nuestros datos de manera no paramétrica. Por eso cuando
mandamos a llamar a plot con la densidad de la función densidad, lo que observamos es
que la gráfica puede tener ciertas curvas, no es totalmente suave. Las gráficas de puntos lo
que nos grafican es un nombre y el valor que va teniendo, entonces lo único que necesita
recibir son un vector de nombres y un vector de valores para cada uno de esos nombres. En
este ejemplo vamos a utilizar el dataset conocido como mtcars. Y una columna de éste, que
es mpg que nos dice el rendimiento por galón de gasolina en millas de los diferentes
modelos de autos. Si mandamos a llamar esa columna y además los nombres de los
coches, podemos utilizar la función Dotchart para generar una gráfica de puntos. Mandamos
a llamar a dotchart primero con un argumento de un vector numérico con los valores de mpg
y como segundo argumento las etiquetas para cada uno de esos valores numéricos.
Finalmente veremos la función Boxplots que lo que hace es generarnos una gráfica de caja.
Este tipo de gráficas lo que hace es, nos dice cómo se están comportando nuestros datos,
unos respecto a otros. Boxplot recibe como parámetros un dataset o un dataframe. En este
caso utilizaremos de nuevo mtcars, como las columnas de este dataset están nombradas,
podemos utilizarlas en la fórmula que vamos a poner también como parámetro de entrada.
En el caso que estamos observando, podemos ver que estamos tratando de explicar la
columna mpg por el número de cilindros o llamada cyl.
Entonces el boxplot que nos generará será por cada número de cilindro, los valores de
dispersión de las millas por hora, dependiendo también de todos los modelos que estamos
observando con ese número de cilindros. También como lo hemos hecho con otras
funciones de alto nivel, podemos pasarle parámetros la función boxplot para cambiar títulos
y etiquetas de los ejes.
Desarrollo del módulo, paso a paso.
Estructuras de control
Dejan controlar el flujo de un programa dependiendo si se ejecutan las condiciones o no de
esta estructura.
Tipos:
-Condicionales (IF,else)
-Bucles de repeticion(for)
-Bucles de condición(while)
-Bucles infinitos(repet)
FOR
Lo que se usa es utilizar la palabra especial for.Se abre un paréntesis con algo en medio y
luego se abre y se cierran las llaves donde se lleva a cabo la operación.
En el for tenemos la palabra especial for, luego entre paréntesis ahora sí lo que es conocido
como un generador de rango. Y entre, en el cuerpo del for, las operaciones que estaríamos
llevando a cabo. Un generador de rangos no es más que una estructura que podríamos ir
recorriendo uno a uno.
Es por eso que, mientras, que es lo que significa la palabra while en inglés, se cumpla la
condición, el cuerpo del while. Va a ser ejecutado.
While, también puede tener más de una condición y estas pueden ser conectadas dentro de
los paréntesis por medio de operadores lógicos.
REPEAT Y BREAK
Si la condición se cumple. Entonces puede llevar a cabo lo que queremos que lleve a cabo,
las operaciones.
BREAK
Podemos utilizar un break para romper ese bucle y continuar con el camino del flujo del
programa.
NEXT
Esto nos puede ocasionar problemas. Y finalmente, utilizar estas estructuras de modo
interactivo, puede ser un poco complicado. No lo dijimos de manera explícita, pero para
evitarnos ésto, podemos utilizar la familia de funciones conocidas como apply.
FUNCIONES
Las funciones son los bloques de construcción de análisis más complejos , estás se crean
utilizando la función especial llamada function(), y cuando se crean se guardan como un
objeto de R con clase tipo “fuction”