R tiene dos secciones de trabajo: el SCRIPT y la CONSOLA. Este software requiere que las instrucciones de lo que debe hacer se escriban (con cierta sintáxis) en el SCRIPT y se ejecuten en la CONSOLA.
Dentro de la consola de R está una “línea de comandos”, donde las instrucciones, línea por línea, se ejecutan una a la vez. También es en la consola se ‘imprimen’ los resultados de los comandos.
> código
[1] resultado
# Esto es un comentario, no son comandos
# El signo de gato le especifica a R que no ejecute lo que haya a continuación
Símbolos importantes: + - * ^ /
Los comandos de sum()
, sqrt()
, log()
son ejemplos de funciones. Las funciones son instrucciones que mandas llamar a través de un nombre específico, reservado sólo para esa función. Por lo general requieren un input y devuelven un output.
Cuando una función podría tener varias maneras de calcular el resultado, entonces utiliza argumentos adicionales para que nosotros le indiquemos lo que queremos.
Por ejemplo, hay varias maneras de hacer un logaritmo ¿verdad?. Por defecto se calcula el logaritmo natural, pero si queremos el “logaritmo base 10”, lo podemos especificar en el argumento base = ___
.
log(1.55)
[1] 0.4382549
log(1.55, base = 10)
[1] 0.1903317
log(1.55, base = 2)
[1] 0.6322682
En R también podemos hacer operaciones lógicas.
Símbolos importantes: > < == !=
Ojo: para preguntar si dos valores son iguales se ocupan dos signos juntos ==
¿Cómo responde R a las siguientes preguntas?
Vamos a guardar datos dentro de variables nombradas. Al darle un nombre a una variable no puedes ocupar espacios ni números (al inicio).
Al realizar asignaciones de objetos, la consola no “devuelve” ningún resultado. Si queremos ver el contenido de un objeto se debe llamar en una nueva línea.
Hay distintos tipos de objetos en R y es importante saber la clase de los objetos con los que se está trabajando.
La función class()
permite averiguar este atributo de los objetos.
Pregunta
¿Qué clase tendría el objeto ‘capcioso’? capcioso <- class(SegundoObjeto)
Utiliza la consola superior para ponerlo a prueba. ¿Entiendes el resultado? Explica por qué se obtiene eso.
Saber la clase que R le está asignando a las variables es importante para poder saber el tipo de operaciones que podemos hacer con cada una.
Por ejemplo, una clase muy particular son las fechas, y R permite hacer operaciones interesantes con ellas.
Calcula el número de días que han transcurrido desde que naciste
Los datos se pueden almacenar en distintas estructuras:
La función c()
se utiliza para concatenar varios elementos y crear VECTORES. También podemos crear vectores vacíos con la función vector()
.
OJO Los vectores deben almacenar elementos de la misma clase.
A este fenómeno se le conoce como coerción. Al combinar clases diferentes en un vector, se les asigna aquella que pueda “asimilar” a las otras.
Vamos a explorar los siguientes datos, que corresponden a la información de los integrantes de este curso.
nombres <- c("Karen Daniela", "Mirna Patricia", "Guadalupe", "Carlos Eugenio",
"Daniela Sofia", "Rodrigo", "Jacob", "Itzama", "Sara Raquel Candelaria",
"Edgar Armando", "Andres", "Daniel", "Ricardo", "Carlos Roberto",
"Cuevas", "Alfonso")
sem <- c(5, 9, 8, 5, 6, 10, 7, 3, 10, 9, 7, 9, 10, 7, 9, 7)
mails <- c("karensda@hotmail.com", "garrido.mirna@hotmail.com", "lupillo.guada15@gmail.com",
"cetg98@gmail.com", "dvalerios@hotmail.com", "ro.corona29@gmail.com",
"jacob.cervantes.anguiano@gmail.com", "itzamadg@hotmail.com",
"sara.raquel.ripe@gmail.com", "ed.armando.monsivais@gmail.com",
"andresrob94@hotmail.com", "daniel-navarrete3@live.com", "ricardosernavargas@gmail.com",
"caroraga@live.com", "e.cuevasp@hotmail.com", "Alfonsofrancko@gmail.com")
carr <- c("CIENCIA POLITICA", "CIENCIA POLITICA", "CIENCIA POLITICA",
"ECONOMIA", "CIENCIA POLITICA", "CIENCIA POLITICA", "ECO/CPOL",
"MATEMATICAS APLICADAS", "CIENCIA POLITICA", "CIENCIA POLITICA",
"ECONOMIA", "CIENCIA POLITICA", "CIENCIA POLITICA", "ACTUARIA Y DIRECCION FINANCIERA",
"ECONOMIA", "ECONOMIA")
calif1 <- c(6.68, 7.09, 7.3, 8.51, 6.88, 4.95, 5.61, 9.48, 5.75, 7.82,
6.99, 8.38, 6.84, 6.06, 4.87, 5.79)
calif2 <- c(7.22, 8.97, 8.93, 5.91, 9.08, 5.82, 5.84, 9.73, 8.69, 9.22,
9.51, 8.3, 6.49, 8.1, 5.96, 6.08)
Los objetos anteriores son vectores, pero la información que contienen está relacionada y sería más conveniente trabajar los datos en conjunto en una tabla.
Los DATA FRAMES son la estructura de datos en R que permiten trabajar de esta manera. En un data frame, cada columna corresponden a una VARIABLE, mientras que cada fila corresponde a una OBSERVACIÓN.
Los nombres de las variables dentro de un data frame deben seguir las mismas reglas de los nombres de objetos.
El último argumento stringsAsFactors
hace referencia a como se deben tratar las variables de tipo “character” también conocidos como “strings”.
Hay una clase de objeto en R llamada factor, que se utiliza para indicar que una variable es categórica.
Por defecto, al construir o importar una tabla tipo data.frame
, la instrucción va a interpretar a las variables alfanuméricas como si fueran categóricas o “factor”.
Lo recomendable es indicarle que no las convierta en “factor”.
grupo <- data.frame(Alumnos = nombres,
Semestre = sem,
Carrera = carr,
Correo = mails,
Tarea = calif1,
Examen = calif2,
stringsAsFactors = FALSE)
El resultado es el siguiente:
Alumnos | Semestre | Carrera | Correo | Tarea | Examen |
---|---|---|---|---|---|
Karen Daniela | 5 | CIENCIA POLITICA | karensda@hotmail.com | 6.68 | 7.22 |
Mirna Patricia | 9 | CIENCIA POLITICA | garrido.mirna@hotmail.com | 7.09 | 8.97 |
Guadalupe | 8 | CIENCIA POLITICA | lupillo.guada15@gmail.com | 7.30 | 8.93 |
Carlos Eugenio | 5 | ECONOMIA | cetg98@gmail.com | 8.51 | 5.91 |
Daniela Sofia | 6 | CIENCIA POLITICA | dvalerios@hotmail.com | 6.88 | 9.08 |
Rodrigo | 10 | CIENCIA POLITICA | ro.corona29@gmail.com | 4.95 | 5.82 |
Jacob | 7 | ECO/CPOL | jacob.cervantes.anguiano@gmail.com | 5.61 | 5.84 |
Itzama | 3 | MATEMATICAS APLICADAS | itzamadg@hotmail.com | 9.48 | 9.73 |
Sara Raquel Candelaria | 10 | CIENCIA POLITICA | sara.raquel.ripe@gmail.com | 5.75 | 8.69 |
Edgar Armando | 9 | CIENCIA POLITICA | ed.armando.monsivais@gmail.com | 7.82 | 9.22 |
Andres | 7 | ECONOMIA | andresrob94@hotmail.com | 6.99 | 9.51 |
Daniel | 9 | CIENCIA POLITICA | daniel-navarrete3@live.com | 8.38 | 8.30 |
Ricardo | 10 | CIENCIA POLITICA | ricardosernavargas@gmail.com | 6.84 | 6.49 |
Carlos Roberto | 7 | ACTUARIA Y DIRECCION FINANCIERA | caroraga@live.com | 6.06 | 8.10 |
Cuevas | 9 | ECONOMIA | e.cuevasp@hotmail.com | 4.87 | 5.96 |
Alfonso | 7 | ECONOMIA | Alfonsofrancko@gmail.com | 5.79 | 6.08 |
Específicamente en el caso de las columnas de un data frame, siempre están nombradas, y se puede acceder a ellas por su nombre usando el signo de pesos $
.
También de esa forma podemos crear nuevas columnas.
Variable de Calificación Final
Una columna que contenga el promedio de Tarea(30%) y Examen(70%).
grupo$Final <- (grupo$Tarea*0.3) + (grupo$Examen*0.7)
Variable lógica que indique si la persona aprobó el curso
grupo$Aprobado <- grupo$Final >= 6
Crear una variable que indique si la persona es de Ciencia Política o no
grupo$CPol <- ifelse(grupo$Carrera == "CIENCIA POLITICA",
yes = "CIENCIA POLITICA",
no = "OTRA")
Crear una variable que me indique el servicio de correo que ocupa cada alumn@
En la columna de Correo, todo lo que aparece antes del @ es diferente para cada persona, y podemos entonces buscar una función que “borre” aquello que aparece antes de ese símbolo.
La función sub()
sustituye un patrón por una expresión nueva.
Para patrones complejos como “todo lo que esté antes de este símbolo”, se utiliza una sintáxis conocida como “regex”, la cual no es exclusiva de R, sino de muchos programas.
grupo$Servicio <- sub(pattern = ".*@", replacement = "", x = grupo$Correo)
Además de la multitud de funciones que hay en el lenguaje base de R, existe una enorme cantidad de funciones que han sido desarrolladas por la comunidad. Como R es un lenguaje de programación bajo licencia abierta, puede ser utilizado, modificado, ampliado, y compartido por cualquier usuario. Esto ha permitido que se publiquen paquetes de funciones dirigidas a tareas específicas, complementarias al R base. Hay paquetes que se han vuelto sumamente populares, y es prácticamente igual de indispensable saber manejarlos que los comandos básicos de R. En el sitio web de RDocumentation, puedes encontrar mucha información relacionada con los paquetes para R.
Los paquetes pueden ser descargados a través de la función install.packages()
. Al hacerlo es posible que aparezcan mensajes en la consola relacionados con la conexión al servidor, el progreso de instalación y el destino de la descarga.
# readxl es un paquete para trabajar con archivos de excel
install.packages("readxl")
# Algunos de los paquetes que se utilizarán durante el curso
install.packages(c("dplyr", "pacman", "writexl"))
Y hay otra serie de funciones para revisar actualizaciones, desinstalar, o simplemente revisar la lista de paquetes previamente instalados.
update.packages() # actualizar todos
remove.packages(...) # desinstalar un paquete
installed.packages() # lista de paquetes instalados
Después de instalar un paquete, éste se guarda en una biblioteca, y es necesario llamarlo para hacer uso de sus funciones. Esta acción se realiza mediante library()
, y su función opuesta es detach(..., unload=TRUE)
.
A diferencia de install.packages(), library() no acepta vectores, así que se tiene que llamar independientemente para cada paquete, pero por otro lado, no es necesario utilizar comillas. Una vez ejecutado, todo el paquete, incluyendo su código y su documentación, estarán disponibles en el ambiente de trabajo actual.
En este momento, comenzemos por cargar el paquete:
library(readxl)
Las funciones más comúnes para realizar acciones de importación y de exportación son:
read.table()
con la coma siendo por default el separador y header=TRUE
Para importar archivos de Excel de formato .xls o .xlsx es necesario instalar un paquete adicional, como readxl
o XLConnect
, que contienen funciones para la lectura de hojas de Excel.
También se pueden importar datos generados en otros programas estadísticos como Stata y SPSS. De igual forma, resulta necesario utilizar paquetes como foreign
o readstata13
que incluye por ejemplo: read.dta13()
y read.spss()
. Una vez cargados los archivos a la sesión de R
, las tablas se convierten a objetos de R y no conservan atributos de los otros programas.
Las sesiones de R se encuentran conectadas a una carpeta de la computadora conocida como el directorio de trabajo. Cuando importas archivos se puede especificar la ruta completa que debe seguir para encontrar el archivo (por ejemplo: "C:/Usuario/Juan/Documentos/Curso/tabla_de_datos.txt"
).
O bien, trabajar directamente en tu directorio de trabajo y entonces simplemente buscará ahí los archivos y marcará error si no lo encuentra.
Igualmente al exportar tablas o gráficos de R, por default lo hará en el directorio de trabajo.
Lo primero es saber ¿cuál es el directorio de trabajo por defecto?
# get working directory
# es una función sin argumentos
getwd()
[1] "C:/Users/Cris/Desktop/ClasedeR/ITAM/clase1"
¿Cómo cambiar el directorio de trabajo?
Una manera muy versátil de cambiar de directorio de trabajo es utilizando el navegador del panel inferior derecho, en la pestaña de Archivos, donde además de poder crear, eliminar o renombrar carpetas de la computadora, el ícono de la herramienta contiene la opción de Set As Working Directory que establece como directorio la carpeta en donde te encuentres en ese momento.
Ahora podemos buscar los datos que queremos utilizar en R e importar el archivo de la siguiente manera:
library(readxl)
grupo <- read_excel("Grupo 2019 octubre.xlsx")
View(grupo)
Vamos a explorar algunas características generales del objeto que se crea tras importar el archivo de excel.
Características
# ¿Qué clase de objeto es "grupo"?
class(grupo)
[1] "data.frame"
# ¿Qué variables contiene?
names(grupo)
[1] "Alumnos" "Semestre" "Carrera" "Correo" "Tarea" "Examen"
[7] "Final" "Aprobado" "CPol" "Servicio"
# ¿Qué clase tiene cada variable?
sapply(grupo, class)
Alumnos Semestre Carrera Correo Tarea Examen
"character" "numeric" "character" "character" "numeric" "numeric"
Final Aprobado CPol Servicio
"numeric" "logical" "character" "character"
# ¿Qué estructura tiene este data frame?
str(grupo)
'data.frame': 16 obs. of 10 variables:
$ Alumnos : chr "Karen Daniela" "Mirna Patricia" "Guadalupe" "Carlos Eugenio" ...
$ Semestre: num 5 9 8 5 6 10 7 3 10 9 ...
$ Carrera : chr "CIENCIA POLITICA" "CIENCIA POLITICA" "CIENCIA POLITICA" "ECONOMIA" ...
$ Correo : chr "karensda@hotmail.com" "garrido.mirna@hotmail.com" "lupillo.guada15@gmail.com" "cetg98@gmail.com" ...
$ Tarea : num 6.68 7.09 7.3 8.51 6.88 4.95 5.61 9.48 5.75 7.82 ...
$ Examen : num 7.22 8.97 8.93 5.91 9.08 5.82 5.84 9.73 8.69 9.22 ...
$ Final : num 7.06 8.41 8.44 6.69 8.42 ...
$ Aprobado: logi TRUE TRUE TRUE TRUE TRUE FALSE ...
$ CPol : chr "CIENCIA POLITICA" "CIENCIA POLITICA" "CIENCIA POLITICA" "OTRA" ...
$ Servicio: chr "hotmail.com" "hotmail.com" "gmail.com" "gmail.com" ...
En el manejo de datos, una tarea muy frecuente y muy útil es conocer cuantas observaciones hay en cada valor que toma una variable.
Por ejemplo:
Para crear estas tablas de frecuencia/ tablas de contingencia, se utiliza la función table()
.
table(grupo$CPol)
CIENCIA POLITICA OTRA
9 7
table(grupo$Servicio)
gmail.com hotmail.com live.com
8 6 2
table(grupo$Semestre) ; barplot(table(grupo$Semestre))
3 5 6 7 8 9 10
1 2 1 4 1 4 3
table(grupo$Aprobado, grupo$CPol)
CIENCIA POLITICA OTRA
FALSE 1 3
TRUE 8 4
La función subset()
es muy útil para obtener el subconjunto de observaciones de una tabla que cumplan cierta condición que estemos buscando.
La sintáxis requiere de una expresión lógica que le indique qué elementos o filas dejar, y después (opcionalmente) seleccionar las columnas a mostrar.
Ejemplos:
subset(grupo, Semestre < 6,
select = 1:2)
Alumnos Semestre
1 Karen Daniela 5
4 Carlos Eugenio 5
8 Itzama 3
subset(grupo, CPol == "OTRA",
select = c(Alumnos, Carrera))
Alumnos Carrera
4 Carlos Eugenio ECONOMIA
7 Jacob ECO/CPOL
8 Itzama MATEMATICAS APLICADAS
11 Andres ECONOMIA
14 Carlos Roberto ACTUARIA Y DIRECCION FINANCIERA
15 Cuevas ECONOMIA
16 Alfonso ECONOMIA
subset(grupo, Final == max(Final),
select = 1)
Alumnos
8 Itzama
subset(grupo, Aprobado == TRUE & CPol != "OTRA",
select = c(Alumnos, Final, Semestre))
Alumnos Final Semestre
1 Karen Daniela 7.058 5
2 Mirna Patricia 8.406 9
3 Guadalupe 8.441 8
5 Daniela Sofia 8.420 6
9 Sara Raquel Candelaria 7.808 10
10 Edgar Armando 8.800 9
12 Daniel 8.324 9
13 Ricardo 6.595 10
Una cuestión muy importante al analizar datos es buscar relaciones entre variables.
En este caso, podríamos imaginar que existe una relación entre la variable Tarea y la variable Examen. Si la tarea fue dejada previa al examen, entonces es posible suponer que el desempeño en el examen tiene una correspondencia con el desempeño en la tarea.
¿Cómo podemos evaluar si nuestra suposición es cierta?
Una manera es calcular un coeficiente de correlación, una medida de la magnitud y dirección de una relación lineal entre dos variables.
¿Cómo interpretas este resultado?
cor(grupo$Examen, grupo$Tarea)
[1] 0.5364508
Visualizar relaciones
También podemos visualizar la relación entre las variables generando un gráfico.
Un gráfico nos serviría para observar cómo se comporta Examen con respecto a Tarea. Para denotar en R una relación entre una variable explicativa y una de respuesta, utilizamos la “tilde”: a ~ b
(a depende de b).
plot(Examen ~ Tarea, data = grupo)
Otra pregunta que podríamos hacernos es: ¿la calificación final tiene una distribución diferente entre los alumnos de CPOL vs. los otros alumnos?
Como en este caso una variable es categórica, el gráfico más apropiado es un “side-by-side boxplot”.
boxplot(Final ~ CPol, data = grupo)