¿Qué aprenderás?

  1. ¿Qué es R? ¿Cómo puede aliviar la carga de reportes repetidos?
  2. Funciones básicas para manipular datos
  3. Usar R de manera efectiva
  4. Más manipulación de datos
  5. Visualización de datos
  6. Un vistazo a temas avanzados

¿Qué es R?




R es un lenguaje de programación (libre!) para trabajar con datos.

Beneficios de R



Se complementa fácilmente con otras herramientas de manejo de datos (como Excel)


La magia del R es que es reproducible (por otra persona o por ti mismo luego de un tiempo)


Mantiene los datos separados del código (preparación de datos paso a paso)

Empezar a trabajar con R




Necesitamos el lenguaje R

y también el software RStudio

Usando R



Puedes usar R a través de paquetes (librerías)


…que contienen funciones


…que son como verbos

tidyverse


  • meta paquete de R que carga ocho paquetes principales cuando se invoca y también agrupa muchos otros paquetes al momento de la instalación

  • los paquetes tidyverse comparten una filosofía de diseño, una gramática común y estructuras de datos

tidyverse

Datos de hoy

faculty

year id rank dept1 dept2
2021-22 1005 Lecturer Chemistry
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music
2021-22 1095 Adjunct Instructor Sociology

courses

semester course_id faculty_id dept enrollment level
20212202 10605 1772 Physics 7 UG
20212202 10605 1772 Physics 32 GR
20212202 11426 1820 Political Science 8 UG
20212202 12048 1914 English 24 UG
20212202 13269 1095 Sociology 48 UG
20212202 13517 1086 Music 17 UG
library(tidyverse)
faculty <- read_csv("faculty.csv")
courses <- read_csv("courses.csv")

Operadores útiles



<-

“almacenar como”

Alt + -

%>%

“y entonces”

Cmd + shift + m

Ejemplo: Resumen estadístico

Calcular la media del número de alumnos inscritos

head(courses)
# A tibble: 6 × 6
  semester course_id faculty_id dept              enrollment level
     <dbl>     <dbl>      <dbl> <chr>                  <dbl> <chr>
1 20212202     10605       1772 Physics                    7 UG   
2 20212202     10605       1772 Physics                   32 GR   
3 20212202     11426       1820 Political Science          8 UG   
4 20212202     12048       1914 English                   24 UG   
5 20212202     13269       1095 Sociology                 48 UG   
6 20212202     13517       1086 Music                     17 UG   
mean(enrollment)
Error: objeto 'enrollment' no encontrado

Accediendo a una variable

Enfoque 1: Con attach():

attach(courses)
mean(enrollment)
[1] 28.75962


No recomendable. ¿Qué pasaría si tuviera otro conjunto de datos con el que está trabajando al mismo tiempo llamado que también tuviera una variable llamada enrollment?

Accediendo a una variable

Enfoque 2: Usando $:

mean(courses$enrollment)
[1] 28.75962


Enfoque 3: Usando with():

with(courses, mean(enrollment))
[1] 28.75962

Accediendo a una variable

Enfoque 4: El enfoque de tidyverse:

courses %>%
  summarise(mean_enrollment = mean(enrollment))
# A tibble: 1 × 1
  mean_enrollment
            <dbl>
1            28.8
  • Más detallado
  • Pero también más expresivo y extensible.

El enfoque tidyverse

  • Las funciones tidyverse toman un argumento data que les permite localizar cálculos dentro del marco de datos especificado

  • no enturbia el concepto de lo que hay en el entorno actual: siempre se accede a las variables desde dentro de un marco de datos sin el uso de una función adicional (como with()) o comillas, nunca como un vector

Funciones importantes


filter mantiene o elimina filas (observaciones)

select mantiene o elimina columnas (variables)

arrange ordena el conjunto de datos por cierta variable(s)

count calcula frecuencias para cierta variable(s)

mutate crea nuevas mariables

group_by/summarize agrega datos (tablas pivote!)

str_* prefijo de funciones para trabajar con texto

Sintaxis de una función



function(data, argument(s))


es lo mismo que


data %>%

    function(argument(s))

Filter

filter mantiene o descarta filas (observaciones)

El operador == evalúa igualdad (comparación)


faculty %>% 
  filter(dept1 == "Sociology")
year id rank dept1 dept2
2021-22 1095 Adjunct Instructor Sociology
2021-22 1118 Assistant Professor Sociology
2021-22 1161 Assistant Professor Sociology
2021-22 1191 Professor Sociology
2021-22 1216 Associate Professor Sociology American Studies
2021-22 1273 Assistant Professor Sociology

Filter


El operador | significa “o”


faculty %>% 
  filter(dept1 == "Sociology" | 
           dept1 == "Physics")
year id rank dept1 dept2
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1095 Adjunct Instructor Sociology
2021-22 1118 Assistant Professor Sociology
2021-22 1161 Assistant Professor Sociology
2021-22 1191 Professor Sociology

Filter


El operador %in% permite seleccionar múltiples opciones en una lista


faculty %>% 
  filter(dept1 %in% c("Sociology",
                      "Physics",
                      "Music"))
year id rank dept1 dept2
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music
2021-22 1095 Adjunct Instructor Sociology
2021-22 1118 Assistant Professor Sociology

Filter


El operador & combina condiciones


faculty %>% 
  filter(dept1 %in% c("Sociology",
                      "Physics",
                      "Music") &
         rank == "Professor")
year id rank dept1 dept2
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1191 Professor Sociology
2021-22 1201 Professor Physics
2021-22 1209 Professor Music
2021-22 1421 Professor Physics Engineering

Select


select mantiene o descarta columnas (variables)


faculty %>% 
  select(id, dept1, rank)
id dept1 rank
1005 Chemistry Lecturer
1022 Physics Professor
1059 Physics Professor
1079 Music Lecturer
1086 Music Assistant Professor
1095 Sociology Adjunct Instructor

Select


puede eliminar columnas con -column


faculty %>% 
  select(-dept2)
year id rank dept1
2021-22 1005 Lecturer Chemistry
2021-22 1022 Professor Physics
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music
2021-22 1095 Adjunct Instructor Sociology

Select


El operador pipe %>% encadena múltiples funciones juntas


faculty %>% 
  select(id, dept1, rank) %>% 
  filter(rank == "Professor")
id dept1 rank
1022 Physics Professor
1059 Physics Professor
1191 Sociology Professor
1201 Physics Professor
1209 Music Professor
1407 English Professor

Arrange


arrange ordena el conjunto de datos de acuerdo con cierta variable(s)

Usar desc() para ordenar descendentemente


courses %>% 
  arrange(desc(enrollment))
semester course_id faculty_id dept enrollment level
20212201 10511 1005 Chemistry 50 UG
20212201 15934 1421 Physics 50 UG
20192002 13850 1105 Chemistry 50 UG
20181901 17773 1942 Music 50 UG
20212202 13269 1095 Sociology 48 UG
20202101 16202 1816 Political Science 48 UG

Arrange


Es posible ordenar de acuerdo con varias variables.


courses %>% 
  arrange(dept, desc(enrollment))
semester course_id faculty_id dept enrollment level
20212201 10511 1005 Chemistry 50 UG
20192002 13850 1105 Chemistry 50 UG
20202102 13850 1258 Chemistry 39 UG
20202102 16606 1393 Chemistry 38 UG
20202101 16540 1784 Chemistry 38 UG
20181901 10511 1829 Chemistry 36 UG

Count


count muestra distribuciones de frecuencias de variables (muy útil para familiarizarse con los datos)


courses %>% 
  count(dept)
dept n
Chemistry 16
English 18
Music 17
Physics 19
Political Science 17
Sociology 17

Count


Puede usar sort = TRUE para ordenar los resultados


courses %>% 
  count(dept, level, sort = TRUE)
dept level n
Chemistry UG 16
English UG 16
Music UG 16
Physics UG 16
Political Science UG 16
Sociology UG 16
Physics GR 3
English GR 2
Music GR 1
Political Science GR 1
Sociology GR 1

Mutate


mutate crea nuevas variables (con un = simple)


faculty %>% 
  mutate(new = "hello!")
year id rank dept1 dept2 new
2021-22 1005 Lecturer Chemistry hello!
2021-22 1022 Professor Physics Engineering hello!
2021-22 1059 Professor Physics hello!
2021-22 1079 Lecturer Music hello!
2021-22 1086 Assistant Professor Music hello!
2021-22 1095 Adjunct Instructor Sociology hello!

Mutate


mucho más útil con una estructura condicional como ifelse(), la cuál tiene tres argumentos:

condición, valor si es verdadero, valor si es falso

faculty %>% 
  mutate(prof = ifelse(rank == "Professor",
                       1, 0)) %>% 
  select(rank, prof)
rank prof
Lecturer 0
Professor 1
Professor 1
Lecturer 0
Assistant Professor 0
Adjunct Instructor 0

Mutate


el operador ! significa no (negación)

is.na() identifica valores perdidos


faculty %>% 
  mutate(joint = ifelse(!is.na(dept2),
                        "joint", NA)) %>% 
  select(dept1, dept2, joint)
dept1 dept2 joint
Chemistry
Physics Engineering joint
Physics
Music
Music
Sociology

Mutate


con múltiples condiciones, case_when() es mucho más sencillo!

faculty %>% 
  mutate(division = case_when(dept1 %in% c("Sociology","Political Science") ~
                                "Social Sciences",
                              dept1 %in% c("Music","English") ~
                                "Humanities",
                              dept1 %in% c("Chemistry","Physics") ~
                                "Sciences")) %>% 
  select(dept1, division)
dept1 division
Chemistry Sciences
Physics Sciences
Physics Sciences
Music Humanities
Music Humanities
Sociology Social Sciences

Group by / summarize


group_by/summarize agrupa datos (tablas pivote!)

group_by() identifica la variable(s) de agrupación y summarize() especifica la agregación.


courses %>% 
  group_by(dept, semester) %>% 
  summarize(enr = sum(enrollment))
dept semester enr
Chemistry 20181901 59
Chemistry 20181902 44
Chemistry 20192001 47
Chemistry 20192002 68
Chemistry 20202101 69
Chemistry 20202102 77

Group by / summarize


funciones útiles en summarize:

mean, median, sd, min, max, n


courses %>% 
  group_by(dept, semester) %>% 
  summarize(enr = sum(enrollment),
            count = n_distinct(course_id))
dept semester enr courses
Chemistry 20181901 59 2
Chemistry 20181902 44 2
Chemistry 20192001 47 2
Chemistry 20192002 68 2
Chemistry 20202101 69 2
Chemistry 20202102 77 2

Trabajando con RStudio

los archivos del proyecto están aquí

los datos importados están por aquí

el código puede
también ir por aquí

Trabajando con RStudio

Escribiendo en la consola

  • Piense en ello como un post-it: útil para notas rápidas pero desechable

  • las acciones se guardan pero el código no

  • se ejecuta un trozo de código a la vez (Return).

Escribir en un archivo de código

  • los archivos de script tienen una extensión .R

  • el código se guarda y se pueden ejecutar secciones de cualquier tamaño (Cmd + Return)

  • ¡haga ~95% de su escritura en un archivo de código en lugar de la consola!

Trabajando con Paquetes

los paquetes deben instalarse en cada computadora que use

# solo necesita hacer esto una vez (por computadora)
install.packages("tidyverse")


los paquetes deben cargarse/adjuntarse con library() al comienzo de cada sesión

# siempre coloque los paquetes necesarios en la parte superior del script
library(tidyverse)


puede acceder a los archivos de ayuda escribiendo ??tidyverse o ??mutate en la consola

Importando Datos

use read_csv() para importar datos de un archivo csv

# ?read_csv() en la consola mostrará el archivo de ayuda con más opciones
faculty <- read_csv("faculty.csv")


el paquete readxl es útil para archivos en Excel

# debe cargarse pero no instalarse ya que es parte del tidyverse
library(readxl)
faculty <- read_excel("faculty.xlsx", sheet = 2)


ver los datos con View(faculty) o haciendo clic en el nombre de los datos en el panel Environment

Funciones Stringr


las funciones stringr (todas inician con str_) son útiles para trabajar con datos de texto

faculty %>% 
  filter(str_detect(rank, "Professor"))
year id rank dept1 dept2
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1086 Assistant Professor Music
2021-22 1118 Assistant Professor Sociology
2021-22 1158 Assistant Professor Political Science
2021-22 1161 Assistant Professor Sociology

Funciones Stringr


cheat sheet de funciones está aquí


courses %>% 
  mutate(year = str_c(str_sub(semester, 1, 4), 
                      "-",
                      str_sub(semester, 5, 6))) %>% 
  select(semester, year) %>% 
  unique()
semester year
20212202 2021-22
20212201 2021-22
20202102 2020-21
20202101 2020-21
20192002 2019-20
20192001 2019-20
20181902 2018-19
20181901 2018-19

Transformar datos (Pivoting)

los datos de faculty existentes tienen una fila por profesor, algunos pertenecen a varios departamentos (a veces conocidos como datos wide)


year id rank dept1 dept2
2021-22 1005 Lecturer Chemistry
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music
2021-22 1095 Adjunct Instructor Sociology

Transformar datos (Pivoting)

¿Qué sucede si, en cambio, desea una fila por profesor por departamento? (a veces conocido como datos long)

year id rank dept_no dept
2021-22 1005 Lecturer dept1 Chemistry
2021-22 1022 Professor dept1 Physics
2021-22 1022 Professor dept2 Engineering
2021-22 1059 Professor dept1 Physics
2021-22 1079 Lecturer dept1 Music
2021-22 1086 Assistant Professor dept1 Music

Transformar datos (Pivoting)


la función pivot_longer alarga los datos


faculty %>% 
  pivot_longer(dept1:dept2,
               names_to = "dept_no",
               values_to = "dept",
               values_drop_na = TRUE) %>% 
  select(-year, -rank)
id dept_no dept
1005 dept1 Chemistry
1022 dept1 Physics
1022 dept2 Engineering
1059 dept1 Physics
1079 dept1 Music
1086 dept1 Music

Transformar datos (Pivoting)


¡y pivot_wider hace lo contrario!

semester course_id faculty_id dept enrollment level
20212202 10605 1772 Physics 7 UG
20212202 10605 1772 Physics 32 GR


courses %>% 
  pivot_wider(names_from = "level",
              values_from = "enrollment")
semester course_id faculty_id dept UG GR
20212202 10605 1772 Physics 7 32
20212202 11426 1820 Political Science 8
20212202 12048 1914 English 24
20212202 13269 1095 Sociology 48

Uniendo datos


R tiene muchas funciones útiles para manejar datos relacionales


todo lo que se requiere es tener al menos una variable tipo llave que conecte los conjuntos de datos


left_join es lo más usual, pero hay más

Uniendo datos

¿Cuál es la inscripción promedio de estudiantes de pregrado (UG) por año y categoría de docente?

faculty

year id rank dept1 dept2
2021-22 1005 Lecturer Chemistry
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music

courses

semester course_id faculty_id dept enrollment level
20212202 10605 1772 Physics 7 UG
20212202 10605 1772 Physics 32 GR
20212202 11426 1820 Political Science 8 UG
20212202 12048 1914 English 24 UG

faculty$id es simimlar a courses$faculty_id

Uniendo datos

¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?


semester course_id faculty_id dept enrollment level
20212202 10605 1772 Physics 7 UG
20212202 10605 1772 Physics 32 GR
20212202 11426 1820 Political Science 8 UG
20212202 12048 1914 English 24 UG
20212202 13269 1095 Sociology 48 UG
  • filtrar cursos solamente de UG
  • crear la variable year nuevamente
  • resumir enrollment por year y faculty_id

Uniendo datos


use el operador <- para crear un nuevo dataframe courses_UG

courses_UG <- courses %>% 
  filter(level == "UG") %>% 
  mutate(year = str_c(str_sub(semester, 1, 4), 
                      "-",
                      str_sub(semester, 5, 6)))

Uniendo datos


filter solo los cursos de pregrado y mutate una nueva variable con el año académico

courses_UG <- courses %>% 
  filter(level == "UG") %>% 
  mutate(year = str_c(str_sub(semester, 1, 4), 
                      "-",
                      str_sub(semester, 5, 6)))

Uniendo datos


group_by año y código del profesor; summarize contando el número de inscritos

courses_UG <- courses %>% 
  filter(level == "UG") %>% 
  mutate(year = str_c(str_sub(semester, 1, 4), 
                      "-",
                      str_sub(semester, 5, 6))) %>% 
  group_by(year, faculty_id) %>% 
  summarize(enr = sum(enrollment))


year faculty_id enr
2018-19 1059 35
2018-19 1086 14
2018-19 1102 37
2018-19 1203 25

Uniendo datos


¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?

faculty

year id rank dept1 dept2
2021-22 1005 Lecturer Chemistry
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music
2021-22 1095 Adjunct Instructor Sociology

courses_UG

year faculty_id enr
2021-22 1005 50
2021-22 1086 17
2021-22 1095 48
2021-22 1128 32
2021-22 1147 32
2021-22 1191 7

Uniendo datos


fac_enr <- faculty %>% 
  left_join(courses_UG, by = c("id" = "faculty_id",
                               "year" = "year"))

1

2

3

  1. data frame nuevo
  2. data frame al que le añadirás datos
  3. data frame donde se encuentran los datos a añadir
year id rank dept1 dept2 enr
2021-22 1005 Lecturer Chemistry 50
2021-22 1022 Professor Physics Engineering
2021-22 1059 Professor Physics
2021-22 1079 Lecturer Music
2021-22 1086 Assistant Professor Music 17
2021-22 1095 Adjunct Instructor Sociology 48

Uniendo datos


¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?

fac_enr <- faculty %>% 
  left_join(courses_UG, by = c("id" = "faculty_id",
                               "year" = "year")) %>% 
  group_by(year, rank) %>% 
  summarize(avg_enr = mean(enr, na.rm = TRUE))


year rank avg_enr
2021-22 Adjunct Instructor 34.66667
2021-22 Assistant Professor 23.60000
2021-22 Associate Professor 17.25000
2021-22 Lecturer 31.83333
2021-22 Professor 32.16667
2021-22 Visiting Researcher

ggplot2


ggplot2 es el paquete de visualización de datos que se carga con tidyverse


la gramática de los gráficos asigna datos a los atributos estéticos de los puntos geométricos


la codificación de datos en señales visuales o canales (p. ej., longitud, color, posición, tamaño) es la forma en que representamos los cambios y las comparaciones

Gráfico de Barras

faculty %>%
  count(rank) %>%
  ggplot(aes(x = rank, y = n)) +
  geom_bar(stat = "identity")

para combinar líneas en un fragmento de código, use + en lugar de %>%

Gráfico de Barras

puede crear una gráfica con mejor presentación con bastante facilidad

expandir para ver el código
faculty %>%
  count(rank) %>%
  ggplot(aes(x = reorder(rank, -n), y = n)) +
  geom_bar(stat = "identity", fill = "#cc0000") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
  geom_text(aes(label = n), vjust = -0.5) +
  labs(x = NULL, y = NULL,
       title = "Count of faculty by rank, 2018-2021") +
  theme_linedraw() +
  theme(panel.grid.major.x = element_blank(),
        axis.ticks = element_blank())

Gráficos de Líneas


fac_enr %>% 
  filter(!is.na(avg_enr)) %>% 
  ggplot(aes(x = year, y = avg_enr, group = rank, color = rank)) +
  geom_line()

Gráficos de Líneas

expandir para ver el código completo
fac_enr %>% 
  filter(!is.na(avg_enr)) %>% 
  ggplot(aes(x = year, y = avg_enr, group = rank, color = rank)) +
  geom_line() +
  geom_point() +
  scale_color_brewer(type = "qual", palette = "Dark2") +
  labs(x = NULL, y = "Average enrollment",
       title = "Average undergraduate enrollment per rank over time") +
  theme_linedraw() +
  theme(panel.grid.major.x = element_blank(),
        axis.ticks = element_blank(),
        legend.title = element_blank(),
        legend.background = element_rect(fill = NA),
        legend.key = element_rect(fill = NA),
        legend.position = c(0.85, 0.82))

Recursos ggplot2

R for Data Science


Data Visualization: a practical introduction


creating custom themes


the ggplot2 book


the R graph gallery

Colocando todo junto


con lo que hemos hecho hasta ahora, su archivo .R podría:

  • importar sus archivos de datos
  • documentar todos los pasos y decisiones de limpieza y preparación de datos
  • producir un gráfico listo para PPT que resuma sus resultados

y ese archivo haría extremadamente fácil para ti o para otra persona reproducir este análisis con nuevos datos dentro de un tiempo

R Markdown


utilizando RStudio, se pueden crear documentos .Rmd que combinen texto, código y gráficos


muchos formatos de salida: html, pdf, Word, diapositivas


sumamente útil para informes parametrizados: puede crear un informe PDF basado en R y generarlo automáticamente para, por ejemplo, cada departamento

Paquetes internos

también puedes crear tus propios paquetes!


tu paquete puede contener:

  • conjuntos de datos comunes que se utilizan en todos los proyectos
  • temas ggplot2 personalizados
  • funciones y cálculos comunes (¡y sus definiciones!) . . .


se puede almacenar en una unidad compartida para facilitar la colaboración

R Markdown y recursos de paquetes


R Markdown

the official R Markdown website

R Markdown: The Definitive Guide


Paquetes internos

Recursos adicionales

R for Data Science: the ultimate guide


R for Excel users: un taller muy útil


STAT 545: libro en linea con análisis de datos reproducibles en R

Portal Web RStudio Education


Portal Web Learn tidyverse