class: center, middle, titular background-size: contain <img src="img/see.png" width="250px"/> # Sección 5: Manipulación de Datos con R ## **PROGRAMA INTERNACIONAL DE ESTADÍSTICA APLICADA A LA INVESTIGACIÓN CIENTÍFICA** #### MÓDULO: SOFTWARES PARA EL MANEJO DE DATOS <br> <br> Linda Cabrera Orellana #### Marzo, 2023 --- class: middle, center, inverse <img src="img/dplyr.png" width="150px"> # Transformación de datos con `dplyr` --- #
Funciones del paquete `dplyr` <br> <br> | Función | Acción | |:---------------|-------------------------------------------:| | `rename()` | *Modifica el nombre de las variables* | | `select()` | *Selecciona o descarta variables (columnas) de un conjunto de datos* | | `filter()` | *Filtra las observaciones (filas) de interés* | | `mutate()` | *Agrega o edita variables (columnas)* | | `summarise()` | *Resume los datos en tablas* | | `group_by()` | *Agrupa o segmenta los datos en función de una variable (columna)* | <br> .footnote[ [dplyr.tidyverse.org](https://dplyr.tidyverse.org/) ] --- #
Modificar el nombre de las variables **`rename()`** se utiliza para cambiar el nombre de las variables. La función tiene el siguiente esquema: ```r rename(data, nombre_nuevo = nombre_columna_existente,... ) ``` Cambiando el nombre de las variables: ```r colnames(profesores) # verifico nombre de variables ## [1] "fecha" "id" "sexo" "edad" "nivel" ## [6] "tiempo" "alumnos" "alumnos_NEE" "asignatura" "asistente" ## [11] "instrucción" "material" ``` ```r profesores <- rename(profesores, instruccion=instrucción, cod=id) colnames(profesores) ## [1] "fecha" "cod" "sexo" "edad" "nivel" ## [6] "tiempo" "alumnos" "alumnos_NEE" "asignatura" "asistente" ## [11] "instruccion" "material" ``` --- #
Seleccionar o descartar variables .pull-left[ **`select()`** permite seleccionar rápidamente un subconjunto útil utilizando operaciones basadas en los nombres de las variables. La función tiene el siguiente esquema: ```r select(data, columna1, columna2, ... ) ``` Selecciono las variables `cod`, `asignatura`, `asistente` e `instruccion` del conjunto de datos `profesores`: ```r seleccion1 <- select(profesores, cod, asignatura, asistente, instruccion) colnames(seleccion1) ## [1] "cod" "asignatura" "asistente" "instruccion" ``` ] .pull-right[ Otra forma de seleccionar variables: ```r seleccion2 <- select(profesores, 2, 9:11) colnames(seleccion2) ## [1] "cod" "asignatura" "asistente" "instruccion" ``` Otra forma de seleccionar variables: ```r seleccion3 <- select(profesores, -fecha, -cod, -sexo, -edad, -tiempo, -nivel, -alumnos, -alumnos_NEE, -material) colnames(seleccion3) ## [1] "asignatura" "asistente" "instruccion" ``` **Ejercicio 5.1.** ¿Qué variables necesito seleccionar para calcular el número promedio de estudiantes por sexo del profesor y nivel de educación? ] --- #
Operador `pipe` %>% .pull-left[ .center[ <img src="img/magrittr.png" width="150px"> ] `magrittr` ofrece un conjunto de operadores que hacen que su código sea más legible. ```r library(magrittr) ``` ] .pull-right[ * Estructura secuencias de operaciones de datos de izquierda a derecha (a diferencia de desde adentro hacia afuera). * Minimiza la necesidad de variables locales y definiciones de funciones, y * Facilita la adición de pasos en cualquier lugar de la secuencia de operaciones. Puede utilizar el atajo de teclado `Ctrl+Shift+M` para generar el operador `%>%`. ```r dataset %>% funcion1() %>% funcion2() %>% funcion3() ``` ] .footnote[ [magrittr.tidyverse.org](https://magrittr.tidyverse.org/) ] ---  --- #
Operador `pipe` %>% .pull-left[ **Sin pipe** ```r select(profesores, cod, asignatura, asistente, instruccion) ## # A tibble: 175 × 4 ## cod asignatura asistente instruc…¹ ## <dbl> <chr> <chr> <chr> ## 1 1 Totalmente de acuerdo Totalmente de acuerdo Totalmen… ## 2 2 De acuerdo Totalmente de acuerdo Ni de ac… ## 3 3 De acuerdo Ni de acuerdo ni en desacuerdo En desac… ## 4 4 Ni de acuerdo ni en desacuerdo Totalmente de acuerdo Ni de ac… ## 5 5 De acuerdo Ni de acuerdo ni en desacuerdo En desac… ## 6 6 Totalmente de acuerdo En desacuerdo De acuer… ## 7 7 Totalmente de acuerdo Totalmente de acuerdo Totalmen… ## 8 8 De acuerdo Ni de acuerdo ni en desacuerdo De acuer… ## 9 9 De acuerdo De acuerdo En desac… ## 10 10 Ni de acuerdo ni en desacuerdo Ni de acuerdo ni en desacuerdo Ni de ac… ## # … with 165 more rows, and abbreviated variable name ¹instruccion ``` ] .pull-right[ **Con pipe** ```r profesores %>% select(cod, asignatura, asistente, instruccion) ## # A tibble: 175 × 4 ## cod asignatura asistente instruc…¹ ## <dbl> <chr> <chr> <chr> ## 1 1 Totalmente de acuerdo Totalmente de acuerdo Totalmen… ## 2 2 De acuerdo Totalmente de acuerdo Ni de ac… ## 3 3 De acuerdo Ni de acuerdo ni en desacuerdo En desac… ## 4 4 Ni de acuerdo ni en desacuerdo Totalmente de acuerdo Ni de ac… ## 5 5 De acuerdo Ni de acuerdo ni en desacuerdo En desac… ## 6 6 Totalmente de acuerdo En desacuerdo De acuer… ## 7 7 Totalmente de acuerdo Totalmente de acuerdo Totalmen… ## 8 8 De acuerdo Ni de acuerdo ni en desacuerdo De acuer… ## 9 9 De acuerdo De acuerdo En desac… ## 10 10 Ni de acuerdo ni en desacuerdo Ni de acuerdo ni en desacuerdo Ni de ac… ## # … with 165 more rows, and abbreviated variable name ¹instruccion ``` ] **Ejercicio 5.2.** ¿Cómo sería el código del Ejercicio 5.1 utilizando el operador `pipe`? Agrega la función `view()` al flujo del código, ¿qué hace la función `view()`? --- #
Filtrar observaciones **`filter()`** te permite filtrar un subconjunto de observaciones según sus valores. La función tiene el siguiente esquema: ```r filter(data, criterio1, criterio2, ... ) ``` Filtre los encuestados de 40 años o más, muestre las 5 primeras filas: ```r profesores %>% filter(edad >= 40) %>% head(5) ## # A tibble: 5 × 12 ## fecha cod sexo edad nivel tiempo alumnos alumn…¹ asign…² ## <dttm> <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <chr> ## 1 2020-06-24 00:00:00 8 Masculino 45 SUPE… 3 24 1 De acu… ## 2 2020-06-24 00:00:00 11 Masculino 47 BASI… 10 33 0 En des… ## 3 2020-06-24 00:00:00 12 Masculino 47 SUPE… 12 19 0 Ni de … ## 4 2020-06-24 00:00:00 15 Femenino 44 INTE… 14 28 2 Ni de … ## 5 2020-06-25 00:00:00 30 Femenino 44 SUPE… 3 33 0 Ni de … ## # … with 3 more variables: asistente <chr>, instruccion <chr>, material <chr>, ## # and abbreviated variable names ¹alumnos_NEE, ²asignatura ``` --- background-image: url("img/dplyr_filter.jpg") background-size: contain --- #
Filtrar observaciones Vamos a delimitar nuestros datos a la población femenina que no tiene estudiantes con NEE, mostrando solo las variables de edad, alumnos, nivel que imparte docencia y material utilizado. ```r profesores %>% filter(sexo=="Femenino" & alumnos_NEE==0) %>% select(edad, alumnos, nivel, material) ## # A tibble: 47 × 4 ## edad alumnos nivel material ## <dbl> <dbl> <chr> <chr> ## 1 30 24 INTERMEDIO Diapositivas ## 2 29 35 BASICO Pizarra ## 3 29 42 BASICO Videos ## 4 44 33 SUPERIOR Diapositivas ## 5 34 26 BASICO Pizarra ## 6 50 26 BASICO Videos ## 7 31 34 BASICO Diapositivas ## 8 36 26 BASICO Pizarra ## 9 31 43 BASICO Libro de texto ## 10 26 37 BASICO Videos ## # … with 37 more rows ``` --- #
Filtrar observaciones Vamos a delimitar nuestros datos a la población masculina que tiene 30, 31 y 32 años de edad, mostrando solo las variables de edad, alumnos, nivel que imparte docencia y material utilizado. ```r profesores %>% filter(sexo=="Masculino" & (edad %in% c(30,31,32))) %>% select(edad, alumnos, nivel, material) ## # A tibble: 7 × 4 ## edad alumnos nivel material ## <dbl> <dbl> <chr> <chr> ## 1 32 38 SUPERIOR Videos ## 2 31 32 BASICO Pizarra ## 3 30 28 BASICO Pizarra ## 4 30 21 BASICO Videos ## 5 32 19 SUPERIOR Otro: Estoy indeciso ## 6 31 42 BASICO Diapositivas ## 7 32 19 BASICO Diapositivas ``` **Ejercicio 5.2.** Identifique el código, sexo y nivel de los profesores encuestados mayores a 40 años que estén totalmente de acuerdo que las clases serían mejor con un asistente en clase a tiempo completo. --- #
Filtrar observaciones Mostrar los encuestados el día 2 de julio. ```r library(lubridate) # extrae el mes de la columna months(profesores$fecha) %>% head(5) ## [1] "junio" "junio" "junio" "junio" "junio" # extrae el día de la columna day(profesores$fecha) %>% head(5) ## [1] 24 24 24 24 24 # filtra encuestados del 2 de julio. profesores %>% filter(months(fecha)=="julio" & day(fecha)==2) ## # A tibble: 2 × 12 ## fecha cod sexo edad nivel tiempo alumnos alumn…¹ asign…² ## <dttm> <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <chr> ## 1 2020-07-02 00:00:00 169 Femenino 54 INTE… 14 33 2 De acu… ## 2 2020-07-02 00:00:00 170 Masculino 26 BASI… 6 25 0 Totalm… ## # … with 3 more variables: asistente <chr>, instruccion <chr>, material <chr>, ## # and abbreviated variable names ¹alumnos_NEE, ²asignatura ``` --- background-image: url("img/dplyr_mutate.png") background-size: contain --- #
Agregar o editar variables **`mutate()`** te permite agregar nuevas columnas a partir de otras ya existentes. La función tiene el siguiente esquema: ```r mutate(data, nombre_nueva_columna = formula, ... ) ``` Agregaremos una columna que contenga el número de estudiantes que no tienen NEE. Mostrar las columnas de la 3 a la 8 y la última. Vamos a delimitar nuestros datos a la población masculina que tiene 30, 31 y 32 años de edad. ```r profesores %>% mutate(sinNEE=alumnos-alumnos_NEE) %>% filter(sexo=="Masculino" & (edad %in% c(30,31,32))) %>% select(c(3:8, sinNEE, 12)) ## # A tibble: 7 × 8 ## sexo edad nivel tiempo alumnos alumnos_NEE sinNEE material ## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 Masculino 32 SUPERIOR 9 38 0 38 Videos ## 2 Masculino 31 BASICO 2 32 1 31 Pizarra ## 3 Masculino 30 BASICO 2 28 0 28 Pizarra ## 4 Masculino 30 BASICO 7 21 0 21 Videos ## 5 Masculino 32 SUPERIOR 8 19 1 18 Otro: Estoy indeci… ## 6 Masculino 31 BASICO 2 42 2 40 Diapositivas ## 7 Masculino 32 BASICO 1 19 0 19 Diapositivas ``` --- #
Resumir información **`summarise()`** se encarga de colapsar un data frame en una sola fila. Es mucho más útil si lo enlazamos con `group_by()`. Para calcular el número promedio de estudiantes: ```r profesores %>% summarise(EstudiantesPromedio = sum(alumnos)/n()) ## # A tibble: 1 × 1 ## EstudiantesPromedio ## <dbl> ## 1 32.5 ``` Para calcular en una misma tabla el número de profesores encuestados, la edad promedio de profesores encuestados y el máximo de tiempo en docencia. ```r profesores %>% summarise(TotalProfesores = n(), EdadPromedioProf = mean(edad), MaxDocencia = max(tiempo)) ## # A tibble: 1 × 3 ## TotalProfesores EdadPromedioProf MaxDocencia ## <int> <dbl> <dbl> ## 1 175 37.5 35 ``` --- #
Agrupar o segmentar datos **`group_by()`** realiza operaciones en grupos definidos por variables que por sí sola no dará ningún resultado, por lo que debe ir seguido de la función `summarise()` con una acción apropiada para realizar. Ahora calculemos el número promedio de estudiantes por sexo y nivel de educación: ```r profesores %>% group_by(sexo, nivel) %>% summarise(EstudiantesPromedio = sum(alumnos)/n()) ## `summarise()` has grouped output by 'sexo'. You can override using the ## `.groups` argument. ## # A tibble: 6 × 3 ## # Groups: sexo [2] ## sexo nivel EstudiantesPromedio ## <chr> <chr> <dbl> ## 1 Femenino BASICO 32.4 ## 2 Femenino INTERMEDIO 33.1 ## 3 Femenino SUPERIOR 33.3 ## 4 Masculino BASICO 30.9 ## 5 Masculino INTERMEDIO 33.5 ## 6 Masculino SUPERIOR 31.9 ``` --- #
Agrupar o segmentar datos Para calcular en una misma tabla el número de profesores encuestados, la edad promedio de profesores encuestados, el máximo de tiempo en docencia y el mínimo de tiempo en docencia, por sexo y nivel de educación: ```r profesores %>% group_by(nivel, sexo) %>% summarise(TotalProfesores = n(), EdadPromedioProfesores = mean(edad), EstudiantesNEE = sum(alumnos_NEE)) ## `summarise()` has grouped output by 'nivel'. You can override using the ## `.groups` argument. ## # A tibble: 6 × 5 ## # Groups: nivel [3] ## nivel sexo TotalProfesores EdadPromedioProfesores EstudiantesNEE ## <chr> <chr> <int> <dbl> <dbl> ## 1 BASICO Femenino 79 36.4 71 ## 2 BASICO Masculino 19 35.1 11 ## 3 INTERMEDIO Femenino 25 43.3 20 ## 4 INTERMEDIO Masculino 17 40.1 12 ## 5 SUPERIOR Femenino 15 33.8 20 ## 6 SUPERIOR Masculino 20 37.7 15 ``` --- #
Operador `pipe` %>% <img src="img/pipe.jpg" width="700" style="display: block; margin: auto;" /> --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA --- #
Práctica: ¡5 minutos! 1. Construir la siguiente tabla. <table> <thead> <tr> <th style="text-align:left;"> Nivel que imparte docencia </th> <th style="text-align:right;"> Profesores </th> <th style="text-align:right;"> Estudiantes </th> <th style="text-align:right;"> Tiempo docencia Promedio </th> <th style="text-align:right;"> Edad Promedio </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> BASICO </td> <td style="text-align:right;"> 98 </td> <td style="text-align:right;"> 3148 </td> <td style="text-align:right;"> 8 </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> INTERMEDIO </td> <td style="text-align:right;"> 42 </td> <td style="text-align:right;"> 1398 </td> <td style="text-align:right;"> 11 </td> <td style="text-align:right;"> 42 </td> </tr> <tr> <td style="text-align:left;"> SUPERIOR </td> <td style="text-align:right;"> 35 </td> <td style="text-align:right;"> 1138 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 36 </td> </tr> </tbody> </table> --- class: middle, center, inverse <br> <br> # Manipulación de Datos con R ### Linda Cabrera Orellana .pull-left[ .center[ ### [@socecuest
](https://www.facebook.com/socecuest) ### [@see_estadistica
](https://www.instagram.com/see_estadistica/) ]] .pull-right[ .center[ ### [@see_estadistica
](https://twitter.com/see_estadistica) ### [@sosecuest
](https://t.me/sosecuest) ]]