class: center, middle, titular background-size: contain <img src="img/see_azul.jpeg" width="300px"/> # Capítulo 3: Manipulación de Datos en R ## **PROGRAMA INTERNACIONAL DE ESTADÍSTICA APLICADA A LA INVESTIGACIÓN CIENTÍFICA** #### MÓDULO: MANEJO DE SOFTWARE <br> <br> Linda Cabrera Orellana #### Octubre, 2022 --- class: middle, center
# **MANIPULACIÓN DE DATOS EN R** ## CAPÍTULO 3 --- #
Contenido del Capítulo 3 - Transformación de datos con `dplyr` * Modificar el nombre de las variables * Seleccionar o descartar variables * Operador pipe `%>%` * Filtrar observaciones * Agregar o editar variables * Resumir información * Agrupar o segmentar datos - Práctica 3.1 - Datos ordenados con `tidyr` * Ordenar datos a lo largo * Ordenar datos a lo ancho --- #
Paquetes a utilizar .pull-left[ *
library(tidyverse) *
`library(dplyr)` *
`library(tidyr)` ] .pull-right[ *
library(magrittr) *
library(datos) ] --- 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 .pull-left[ **`rename()`** se utiliza para cambiar el nombre de las variables. La función tiene el siguiente esquema: ```r rename(data, columnas... ) ``` Cambiando el nombre de las variables: ```r colnames(profesores2) ## [1] "Fecha" "Genero" ## [3] "Edad" "Nivel_docencia" ## [5] "Tiempo_impartiendo_docencia" "No_Alumnos" ## [7] "No_Alumnos NEE" "AD_es_necesaria" ## [9] "AD_en_cualquier_asignatura" "Leyes_para_ANEE" ## [11] "Ratio_de_ANEE" "Asistente_de_clases" ## [13] "Suficiente_instruccion" "Material_utilizado" ``` ] .pull-right[ ```r profesores2 <- rename(profesores2, fecha= Fecha, edad=Edad, sexo=Genero, niveldocencia= Nivel_docencia, tiempo=Tiempo_impartiendo_docencia, alumnos=No_Alumnos, alumnosNEE=`No_Alumnos NEE`, necesaria=AD_es_necesaria, asignatura=AD_en_cualquier_asignatura, leyes=Leyes_para_ANEE, ratio=Ratio_de_ANEE, asistente=Asistente_de_clases, instruccion=Suficiente_instruccion, material=Material_utilizado) colnames(profesores2) ## [1] "fecha" "sexo" "edad" "niveldocencia" ## [5] "tiempo" "alumnos" "alumnosNEE" "necesaria" ## [9] "asignatura" "leyes" "ratio" "asistente" ## [13] "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, columnas... ) ``` ## Ejercicio Práctico - **Indicador 1:** Número promedio de estudiantes - **Indicador 2:** Indicador 1 por sexo y nivel de educación ] .pull-right[ ### Variables de trabajo * Sexo = `sexo` * Edad del encuestado = `edad` * Número de alumnos por profesor = `alumnos` * Nivel de docencia = `niveldocencia` ] --- #
Seleccionar o descartar variables Selecciono las variables que deseo del conjunto de datos: ```r indicador_1a <- select(profesores2, sexo, edad, alumnos, niveldocencia) colnames(indicador_1a) ## [1] "sexo" "edad" "alumnos" "niveldocencia" ``` Otra forma de seleccionar variables: ```r indicador_1a <- select(profesores2, 2, 3, 4, 6) colnames(indicador_1a) ## [1] "sexo" "edad" "niveldocencia" "alumnos" ``` --- #
Operador `pipe` %>% .pull-left[ .center[ <img src="img/magrittr.png" width="200px"> ] `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 `%>%`. ] .footnote[ [magrittr.tidyverse.org](https://magrittr.tidyverse.org/) ] --- #
Operador `pipe` %>% .pull-left[ <br> <br> <br> <br> ```r dataset %>% funcion1() %>% funcion2() %>% funcion3() ``` ] -- .pull-right[ ![](https://erikgahner.dk/img/2022/R_pipe.gif) ] --- #
Operador `pipe` %>% <img src="img/pipe.jpg" width="700" style="display: block; margin: auto;" /> --- #
Operador `pipe` %>% .pull-left[ **Sin pipe** ```r select(profesores2, sexo, edad, alumnos, niveldocencia) ## # A tibble: 175 × 4 ## sexo edad alumnos niveldocencia ## <chr> <dbl> <dbl> <chr> ## 1 Masculino 36 42 Educación infantil, primaria o básica ## 2 Femenino 31 37 Educación superior ## 3 Masculino 35 30 Educación superior ## 4 Femenino 26 19 Educación secundaria y bachillerato ## 5 Femenino 35 25 Educación superior ## 6 Masculino 38 43 Educación superior ## 7 Femenino 35 41 Educación superior ## 8 Masculino 45 24 Educación superior ## 9 Masculino 38 27 Educación superior ## 10 Femenino 37 18 Educación superior ## # … with 165 more rows ``` ] .pull-right[ **Con pipe** ```r profesores2 %>% select(sexo, edad, alumnos, niveldocencia) ## # A tibble: 175 × 4 ## sexo edad alumnos niveldocencia ## <chr> <dbl> <dbl> <chr> ## 1 Masculino 36 42 Educación infantil, primaria o básica ## 2 Femenino 31 37 Educación superior ## 3 Masculino 35 30 Educación superior ## 4 Femenino 26 19 Educación secundaria y bachillerato ## 5 Femenino 35 25 Educación superior ## 6 Masculino 38 43 Educación superior ## 7 Femenino 35 41 Educación superior ## 8 Masculino 45 24 Educación superior ## 9 Masculino 38 27 Educación superior ## 10 Femenino 37 18 Educación superior ## # … with 165 more rows ``` ] --- background-image: url("img/dplyr_filter.jpg") background-size: contain --- #
Filtrar observaciones Para resolver el indicador planteado, vamos a delimitar el universo a las personas de 40 o más años por lo que usaremos **`filter()`**. ```r profesores2 %>% select(sexo, edad, alumnos, niveldocencia) %>% filter(edad >= 40) ## # A tibble: 66 × 4 ## sexo edad alumnos niveldocencia ## <chr> <dbl> <dbl> <chr> ## 1 Masculino 45 24 Educación superior ## 2 Masculino 47 33 Educación infantil, primaria o básica ## 3 Masculino 47 19 Educación superior ## 4 Femenino 44 28 Educación secundaria y bachillerato ## 5 Femenino 44 33 Educación superior ## 6 Masculino 42 29 Educación superior ## 7 Masculino 44 21 Educación superior ## 8 Masculino 40 32 Educación superior ## 9 Femenino 50 26 Educación infantil, primaria o básica ## 10 Femenino 45 44 Educación infantil, primaria o básica ## # … with 56 more rows ``` --- #
Filtrar observaciones Por si deseas combinar condiciones aquí tienes una lista de operadores de comparación y operadores lógicos: .pull-left[ | Condición | Acción | |:--------:|:--------------| | == | igual | | %in% | incluye | | != | diferente | | > | mayor que | | >= | mayor o igual que | | < | menor que | | <= | menor o igual que | ] .pull-right[ | Operador | Acción | |:--------:|:--------------| | & | y - Cuando se cumplen ambas condiciones | | | | o - Cuando se cumple una u otra condición | ] --- #
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 profesores2 %>% filter(sexo=="Femenino" & alumnosNEE==0) %>% select(edad, alumnos, niveldocencia, material) ## # A tibble: 47 × 4 ## edad alumnos niveldocencia material ## <dbl> <dbl> <chr> <chr> ## 1 30 24 Educación secundaria y bachillerato Diapositivas ## 2 29 35 Educación infantil, primaria o básica Pizarra ## 3 29 42 Educación infantil, primaria o básica Videos ## 4 44 33 Educación superior Diapositivas ## 5 34 26 Educación infantil, primaria o básica Pizarra ## 6 50 26 Educación infantil, primaria o básica Videos ## 7 31 34 Educación infantil, primaria o básica Diapositivas ## 8 36 26 Educación infantil, primaria o básica Pizarra ## 9 31 43 Educación infantil, primaria o básica Libro de texto ## 10 26 37 Educación infantil, primaria o básica 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 profesores2 %>% filter(sexo=="Masculino" & (edad %in% c(30,31,32))) %>% select(edad, alumnos, niveldocencia, material) ## # A tibble: 7 × 4 ## edad alumnos niveldocencia material ## <dbl> <dbl> <chr> <chr> ## 1 32 38 Educación superior Videos ## 2 31 32 Educación infantil, primaria o básica Pizarra ## 3 30 28 Educación infantil, primaria o básica Pizarra ## 4 30 21 Educación infantil, primaria o básica Videos ## 5 32 19 Educación superior Otro: Estoy indeciso ## 6 31 42 Educación infantil, primaria o básica Diapositivas ## 7 32 19 Educación infantil, primaria o básica Diapositivas ``` --- background-image: url("img/dplyr_mutate.png") background-size: contain --- #
Agregar o editar variables Vamos a delimitar nuestros datos a la población masculina que tiene 30, 31 y 32 años de edad. Con **`mutate()`** agregaremos una columna que contenga el número de estudiantes que no tienen NEE. Mostrar las primeras 7 columnas y la última. ```r profesores2 %>% mutate(sinNEE=alumnos-alumnosNEE) %>% filter(sexo=="Masculino" & (edad %in% c(30,31,32))) %>% select(c(1:7, sinNEE, 14)) ## # A tibble: 7 × 9 ## fecha sexo edad niveldocencia tiempo alumnos alumnosNEE sinNEE ## <dttm> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> ## 1 2020-06-24 00:00:00 Masc… 32 Educación su… Más d… 38 0 38 ## 2 2020-06-25 00:00:00 Masc… 31 Educación in… Menos… 32 1 31 ## 3 2020-06-26 00:00:00 Masc… 30 Educación in… Menos… 28 0 28 ## 4 2020-06-27 00:00:00 Masc… 30 Educación in… Más d… 21 0 21 ## 5 2020-06-28 00:00:00 Masc… 32 Educación su… Más d… 19 1 18 ## 6 2020-06-29 00:00:00 Masc… 31 Educación in… Menos… 42 2 40 ## 7 2020-06-30 00:00:00 Masc… 32 Educación in… Menos… 19 0 19 ## # … with 1 more variable: material <chr> ``` --- #
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()`. **Indicador 1:** Número promedio de estudiantes ```r profesores2 %>% summarise(EstudiantesPromedio = sum(alumnos)/n()) ## # A tibble: 1 × 1 ## EstudiantesPromedio ## <dbl> ## 1 32.5 ``` --- #
Resumir información **Indicador 3:** Número de profesores encuestados **Indicador 4:** Edad promedio de profesores encuestados **Indicador 5:** Número de estudiantes con NEE ```r profesores2 %>% summarise(TotalProfesores = n(), EdadPromedioProfesores = mean(edad), EstudiantesNEE = sum(alumnosNEE)) ## # A tibble: 1 × 3 ## TotalProfesores EdadPromedioProfesores EstudiantesNEE ## <int> <dbl> <dbl> ## 1 175 37.5 149 ``` --- #
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. - **Indicador 2:** Número promedio de estudiantes por sexo y nivel de educación ```r profesores2 %>% group_by(sexo, niveldocencia) %>% 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 niveldocencia EstudiantesPromedio ## <chr> <chr> <dbl> ## 1 Femenino Educación infantil, primaria o básica 32.4 ## 2 Femenino Educación secundaria y bachillerato 33.1 ## 3 Femenino Educación superior 33.3 ## 4 Masculino Educación infantil, primaria o básica 30.9 ## 5 Masculino Educación secundaria y bachillerato 33.5 ## 6 Masculino Educación superior 31.9 ``` --- #
Agrupar o segmentar datos - **Indicador 6:** Indicador 3, 4 y 5 por sexo y nivel de educación ```r profesores2 %>% group_by(niveldocencia, sexo) %>% summarise(TotalProfesores = n(), EdadPromedioProfesores = mean(edad), EstudiantesNEE = sum(alumnosNEE)) ## `summarise()` has grouped output by 'niveldocencia'. You can override using the ## `.groups` argument. ## # A tibble: 6 × 5 ## # Groups: niveldocencia [3] ## niveldocencia sexo TotalProfesores EdadPromedioPro… EstudiantesNEE ## <chr> <chr> <int> <dbl> <dbl> ## 1 Educación infantil, pri… Feme… 79 36.4 71 ## 2 Educación infantil, pri… Masc… 19 35.1 11 ## 3 Educación secundaria y … Feme… 25 43.3 20 ## 4 Educación secundaria y … Masc… 17 40.1 12 ## 5 Educación superior Feme… 15 33.8 20 ## 6 Educación superior Masc… 20 37.7 15 ``` --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 3.1 --- #
Práctica 3.1 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;"> Estudiantes Promedio </th> <th style="text-align:right;"> Edad Promedio </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Educación infantil, primaria o básica </td> <td style="text-align:right;"> 98 </td> <td style="text-align:right;"> 3148 </td> <td style="text-align:right;"> 32 </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> Educación secundaria y bachillerato </td> <td style="text-align:right;"> 42 </td> <td style="text-align:right;"> 1398 </td> <td style="text-align:right;"> 33 </td> <td style="text-align:right;"> 42 </td> </tr> <tr> <td style="text-align:left;"> Educación superior </td> <td style="text-align:right;"> 35 </td> <td style="text-align:right;"> 1138 </td> <td style="text-align:right;"> 33 </td> <td style="text-align:right;"> 36 </td> </tr> </tbody> </table> --- class: middle, center, inverse <img src="img/tidyr.png" width="150px"> # Datos ordenados con `tidyr` --- #
Datos ordenados Existen tres reglas interrelacionadas que hacen que un conjunto de datos sea ordenado: * Cada variable debe tener su propia columna. * Cada observación debe tener su propia fila. * Cada valor debe tener su propia celda. <div class="figure" style="text-align: center"> <img src="img/tidy_data.png" alt="Figura: Reglas que hacen que un conjunto de datos sea ordenado" width="1000" /> <p class="caption">Figura: Reglas que hacen que un conjunto de datos sea ordenado</p> </div> --- #
Funciones del paquete `tidyr` <br> <br> <br> | Función | Acción | |:---------------|-------------------------------------------:| | `pivot_longer()` | *Modifica el nombre de las variables* | | `pivot_wider()` | *Selecciona o descarta variables (columnas) de un conjunto de datos* | <br> <br> <br> <br> .footnote[ [tidyr.tidyverse.org](https://tidyr.tidyverse.org/) ] --- #
Ordenar datos a lo largo <br> .pull-left[ .center[ <img src="img/longer.png" width="600px"> ] ] .pull-right[ **`pivot_longer()`** alarga datos al contraer varias columnas en dos. Los nombres de columna se mueven a una nueva columna de `names_to` y los valores a una nueva columna de `values_to`. ```r pivot_longer(data, cols, names_to = "name", values_to = "value", values_drop_na = FALSE) ``` ] --- #
Ordenar datos a lo largo .pull-left[ ```r library(datos) table4a ## # A tibble: 3 × 3 ## country `1999` `2000` ## * <chr> <int> <int> ## 1 Afghanistan 745 2666 ## 2 Brazil 37737 80488 ## 3 China 212258 213766 ``` ] .pull-right[ ```r tabla4a %>% pivot_longer(cols = c(`1999`, `2000`), names_to = "anio", values_to = "casos") ## # A tibble: 6 × 3 ## pais anio casos ## <chr> <chr> <int> ## 1 Afganistán 1999 745 ## 2 Afganistán 2000 2666 ## 3 Brasil 1999 37737 ## 4 Brasil 2000 80488 ## 5 China 1999 212258 ## 6 China 2000 213766 ``` ] --- #
Ordenar datos a lo ancho <br> .pull-left[ .center[ <img src="img/wider.png" width="600px"> ] ] .pull-right[ **`pivot_wider()`** es lo contrario de `pivot_longer()`, amplia los datos expandiendo dos columnas en varias. Una columna proporciona los nuevos nombres de columna, la otra los valores. ```r pivot_wider(data, names_from = "name", values_from = "value") ``` ] --- #
Ordenar datos a lo ancho .pull-left[ ```r table2 ## # A tibble: 12 × 4 ## country year type count ## <chr> <int> <chr> <int> ## 1 Afghanistan 1999 cases 745 ## 2 Afghanistan 1999 population 19987071 ## 3 Afghanistan 2000 cases 2666 ## 4 Afghanistan 2000 population 20595360 ## 5 Brazil 1999 cases 37737 ## 6 Brazil 1999 population 172006362 ## 7 Brazil 2000 cases 80488 ## 8 Brazil 2000 population 174504898 ## 9 China 1999 cases 212258 ## 10 China 1999 population 1272915272 ## 11 China 2000 cases 213766 ## 12 China 2000 population 1280428583 ``` ] .pull-right[ ```r tabla2 %>% pivot_wider(names_from = tipo, values_from = cuenta) ## # A tibble: 6 × 4 ## pais anio casos población ## <chr> <int> <int> <int> ## 1 Afganistán 1999 745 19987071 ## 2 Afganistán 2000 2666 20595360 ## 3 Brasil 1999 37737 172006362 ## 4 Brasil 2000 80488 174504898 ## 5 China 1999 212258 1272915272 ## 6 China 2000 213766 1280428583 ``` ] --- class: middle, center, inverse <br> <br> # **¡FIN!** ## Importación y Orden de los Datos en R ### Síguenos .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) ]]