class: center, middle, titular background-size: contain <img src="img/see.png" width="250px"/> # Sección 3: Estructuras de Datos en 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
# Importar datos --- #
Importar archivos `.csv` .pull-left[ .center[ <img src="img/readr.png" width="200px"> ] `readr` lee datos rectangulares de archivos delimitados, como valores separados por comas (CSV) y valores separados por tabuladores (TSV). ] .pull-right[ Para leer un archivo `.csv` la función a utilizar es `read_csv()` del paquete `readr` que es parte del `tidyverse`. Para cargar nuestro archivo: ```r library(readr) players21 <- read_csv("data/CSVplayers_21.csv") ``` También lo podemos hacer con el sistema base de
, aquí no necesitamos cargar ninguna librería. Para esto, nos ubicamos en la barra de herramientas `File -> Import Dataset -> From Text (readr)`. ] .footnote[ [readr.tidyverse.org](https://readr.tidyverse.org/) ] --- #
Importar desde Excel .pull-left[ .center[ <img src="img/readxl.png" width="200px"> ] `readxl` facilita la transferencia de datos de Excel a R y está diseñado para trabajar con datos tabulares. Admite tanto el formato `.xls` heredado como el formato `.xlsx` moderno basado en `xml`. ] .pull-right[ Para leer un archivo de Excel la función a utilizar es `read_excel()` del paquete `readxl` que es parte del `tidyverse`. Para cargar nuestro archivo: ```r library(readxl) profesores <- read_excel("data/EXCELprofesores.xlsx", sheet = "DATA", skip = 1) ``` También lo podemos hacer con el sistema base de
, aquí no necesitamos cargar ninguna librería. Para esto, nos ubicamos en la barra de herramientas `File -> Import Dataset -> From Excel...`. ] .footnote[ [readxl.tidyverse.org](https://readxl.tidyverse.org/) ] --- #
Importar desde SPSS y STATA .pull-left[ .center[ <img src="img/haven.png" width="200px"> ] `haven` permite que R lea y escriba varios formatos de datos utilizados por otros paquetes estadísticos al envolver la fantástica biblioteca ReadStat C escrita por Evan Miller. `haven` es parte del `tidyverse`. ] .pull-right[ .panelset[ .panel[.panel-name[SPSS] ## **SPSS** Para leer un archivo de SPSS la función a utilizar es `read_sav()` del paquete `haven` que es parte del `tidyverse`. Para cargar nuestro archivo: ```r library(haven) estres <- read_sav("data/SPSSestres.sav") ``` ] .panel[.panel-name[STATA] ## **STATA** Para leer un archivo de STATA la función a utilizar es `read_dta()` del paquete `haven` que es parte del `tidyverse`. Para cargar nuestro archivo: ```r library(haven) pasajeros <- read_dta("data/STATApasajeros.dta") ``` ] ] ] .footnote[ [haven.tidyverse.org](https://haven.tidyverse.org/) ] <!-- #
Importar desde la web .pull-left[ .center[ <img src="img/rio.png" width="200px"> ] `rio` realiza importación y exportación optimizada de datos. Usa la extensión de archivo de un nombre de archivo para determinar qué tipo de archivo es. ] .pull-right[ En esta ocasión leeremos información disponible en la web del [Banco Central del Ecuador](https://www.bce.fin.ec/). ```r library(rio) # Data del Banco Central del Ecuador # Para guardar la url de descarga en una variable urlData <- "https://contenido.bce.fin.ec/documentos/Estadisticas/SectorReal/CuentasProvinciales/Can2020.xlsm" # Para importar los datos de la url, escogemos la pestaña # sheet: pestaña del documento # skip: número de filas omitidas # col_names: desea nombre de columnas sea la primera fila dataBCE <- import(urlData, sheet = "VAB Cantonal", skip = 6, col_names = TRUE) ``` ] .footnote[ [github.com/leeper/rio](https://github.com/leeper/rio) ] #
Otros archivos * **Excel:** Usando el paquete `openxlsx` con `read.xlsx(xlsxFile , sheet , startRow , colNames , skipEmptyRows, rowNames)` * `foreign` para cargar archivos de SAS, SPSS, Stata: SAS (`read.xport()`), SPSS (`read.spss()`), Stata (`read.dta()`). * GIS sistemas de información geográfica con `rgal` y `raster`. * `GoogleSpreadSheets` con googlesheets. * `data.table` para manejar grandes volúmenes de datos. Existe un curso corto gratuito brindado por la Sociedad Ecuatoriana de Estadística que pueden visitar en el siguiente link: [https://www.youtube.com/Sociedad_Ecuatoriana_Estadistica](https://www.youtube.com/watch?v=s1QnGTk0x8U&list=PL2PpISw8vp_oJlVXpYYowclogCCLtEOfX). --> --- class: middle, center, inverse
# Estructuras de Datos --- background-image: url("img/estructuras.png") background-size: contain #
Estructuras de Datos --- #
Vectores .pull-left[ El tipo de dato fundamental en R es el vector. Un vector es una secuencia de elementos de datos todos del mismo tipo. Creamos un vector de dimensión 1: ```r x <- 4 is.vector(x) #¿es vector? ## [1] TRUE ``` Hay varias formas de crear vectores, pero una de las más comunes es el operador de concatenación `c()`. ] .pull-right[ A continuación creamos un vector de 4 elementos de tipo numérico: ```r y <- c(11, 13, 15, 20) y #para imprimir vector ## [1] 11 13 15 20 is.vector(y) ## [1] TRUE ``` También podemos crear un vector de tipo caracter de 4 elementos: ```r z <- c("1", "5", "11", "14") z ## [1] "1" "5" "11" "14" is.vector(z) ## [1] TRUE ``` ] --- #
Vectores .pull-left[ También podemos realizar operaciones entre vectores de la misma dimensión: ```r w <- c(2, 5, 6, 8) w ## [1] 2 5 6 8 y + 2*w - 3 ## [1] 12 20 24 33 ``` Para conocer la longitud de un vector usamos `length()`. ```r length(y) ## [1] 4 ``` ] .pull-right[ ¿Qué sucede cuando el vector no tiene el mismo tipo de datos? Esto se denomina _coerción de tipos de datos_ y es motivo de muchas sorpresas y la razón por la cual es necesario conocer los tipos de datos básicos y cómo R los interpreta. Cuando R encuentra una mezcla de tipos de datos (en este caso numeric y character) para combinarlos en un vector, va a forzarlos a ser del mismo tipo. ```r otro_vector <- c(2,6,'3') otro_vector ## [1] "2" "6" "3" ``` ] --- #
Vectores .pull-left[ Podemos llamar elementos específicos de un vector usando la **indexación**. Por ejemplo: * `x[]` es una forma de llamar a un elemento específico de un vector. * `x[1]` es el primer elemento. * `x[3]` es el tercer elemento. * `x[-3]` es un vector con todo menos el tercer elemento. Vamos a intentar indexar los vectores que tenemos: ```r # reviso los elementos que contiene el vector w w ## [1] 2 5 6 8 # extraigo el segundo elemento del vector w w[2] ## [1] 5 ``` ] .pull-right[ Para eliminar elementos del vector: ```r # imprimo el vector w, excepto su tercer elemento w[-3] ## [1] 2 5 8 ``` Indexamos un conjunto de elementos a la vez, para esto creamos un vector de mayor longitud denominado `secuencia`: ```r # genero múltiplos de 3 hasta el 30 secuencia <- seq(3, 30, 3) secuencia ## [1] 3 6 9 12 15 18 21 24 27 30 # seleccionar todos los múltiplos excepto el 3 y el 30 secuencia[2:9] ## [1] 6 9 12 15 18 21 24 27 ``` ] --- #
Vectores ```r # seleccionar los elementos que están en la posición del 3 al 6 y el que está en la posición 8 secuencia[c(3:6, 8)] ## [1] 9 12 15 18 24 ``` Vamos a intentar indexar usan **operadores lógicos**: ```r ## Elegir los números mayores a 30 secuencia > 30 # las posiciones TRUE son los que contienen números mayores a 30 ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE secuencia[secuencia > 30] # regresa los números en las posiciones TRUE ## numeric(0) ## Combinar operadores lógicos ## Elegir los números menores a 25 y mayores a 10 secuencia < 25 ## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE secuencia > 10 ## [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE secuencia < 25 & secuencia > 10 ## [1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE secuencia[secuencia < 25 & secuencia > 10] ## [1] 12 15 18 21 24 ``` --- #
Data.frames .pull-left[ Un data frame es un conjunto de vectores que deben cumplir las siguientes propiedades: * Las componentes son vectores * Cada vector puede ser de un tipo de dato distinto * Cada columna es una variable * Las columnas tienen el mismo largo Las filas se denominan observaciones y las columnas se las denomina variables. ] .pull-right[ .center[ <img src="img/dataframe.png" width="700px"> Artwork by @allison_horst ] ] --- .pull-left[ ##
Crear un data.frame Con la función `data.frame()`, que se conformará de la unión de 3 vectores creados previamente. ```r nombres <- c("Marcela Cox", "Luis Vargas", "David Mieles") edades <- c(24,32,27) seguro <- factor(c("IESS", "BMI", "IESS")) pacientes <- data.frame(nombres, edades, seguro) pacientes ## nombres edades seguro ## 1 Marcela Cox 24 IESS ## 2 Luis Vargas 32 BMI ## 3 David Mieles 27 IESS ``` Ver objeto creado en el panel `Environment`. ] .pull-right[ ##
Cambiar nombre de columnas * Desde la creación del data.frame: ```r pacientes2 <- data.frame(N1=nombres, N2=edades, seguro) pacientes2 ## N1 N2 seguro ## 1 Marcela Cox 24 IESS ## 2 Luis Vargas 32 BMI ## 3 David Mieles 27 IESS ``` * En un data.frame existente con `names()`: ```r names(pacientes2) <- c("Name", "Age", "Insurance") pacientes2 ## Name Age Insurance ## 1 Marcela Cox 24 IESS ## 2 Luis Vargas 32 BMI ## 3 David Mieles 27 IESS ``` ] --- .pull-left[ ##
Navegando por el data.frame Supongamos que queremos extraer la edad de David Mieles. (indexación) ```r pacientes[3,2] ## [1] 27 ``` .center[ <img src="img/dataframe2.png" width="750px"> ] ] .pull-right[ Podemos seleccionar varias columnas y filas a la vez con `:`. ```r ## seleccionar las 2 últimas columnas y las 2 primeras filas pacientes[1:2, 2:3] ## edades seguro ## 1 24 IESS ## 2 32 BMI ``` También podemos consultar a R por los valores de una columna entera de nuestro data set con el símbolo `$`. ```r ## seleccionar la columna nombres pacientes$nombres ## [1] "Marcela Cox" "Luis Vargas" "David Mieles" ``` Y aplicar una función a esa columna: ```r ## calcular el promedio de las edades mean(pacientes$edades) ## [1] 27.66667 ``` ] .footnote[ [tibble.tidyverse.org](https://tibble.tidyverse.org/) ] --- ##
Funciones básicas para explorar data.frames .pull-left[ * **`dim():`** indica las dimensiones del data.frame o tibble, número de filas y columnas. * **`str():`** muestra de forma compacta la estructura interna de un objeto R. * **`colnames():`** muestra el nombre de las variables de un data.frame. * **`head():`** muestra las 10 primeras obervaciones del conjunto de datos. * **`tail():`** muestra las 4 últimas observaciones del conjunto de datos. ] .pull-right[ * **`summary():`** produce resúmenes de resultados de varias variables. Los resultados dependen de la clase de datos. * **`sum():`** devuelve la suma de todos los valores presentes en sus argumentos. * **`min():`** devuelve el valor mínimo de un vector numérico. * **`max():`** devuelve el valor máximo de un vector numérico. ] --- ##
Funciones básicas para explorar data.frames .panelset[ .panel[.panel-name[Encuestados] ¿Cuántas personas llenaron la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas? ```r dim(profesores) ## [1] 175 12 ``` ] .panel[.panel-name[Encuesta] ¿Cuál es la estructura de la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas? ```r str(profesores) ## tibble [175 × 12] (S3: tbl_df/tbl/data.frame) ## $ fecha : POSIXct[1:175], format: "2020-06-24 19:53:09" "2020-06-24 20:31:49" ... ## $ id : num [1:175] 1 2 3 4 5 6 7 8 9 10 ... ## $ sexo : chr [1:175] "Masculino" "Femenino" "Masculino" "Femenino" ... ## $ edad : num [1:175] 36 31 35 26 35 38 35 45 38 37 ... ## $ nivel : chr [1:175] "BASICO" "SUPERIOR" "SUPERIOR" "INTERMEDIO" ... ## $ tiempo : num [1:175] 3 2 2 1 2 5 2 3 1 3 ... ## $ alumnos : num [1:175] 42 37 30 19 25 43 41 24 27 18 ... ## $ alumnos_NEE: num [1:175] 2 1 0 2 2 1 2 1 0 1 ... ## $ asignatura : num [1:175] 5 4 4 3 4 5 5 4 4 3 ... ## $ asistente : num [1:175] 5 5 3 5 3 2 5 3 4 3 ... ## $ instrucción: num [1:175] 5 3 2 3 2 4 5 4 2 3 ... ## $ material : chr [1:175] "Videos" "Videos" "Videos" "Libro de texto" ... ``` ] .panel[.panel-name[Variables] ¿Cuáles son las variables de la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas? ```r colnames(profesores) ## [1] "fecha" "id" "sexo" "edad" "nivel" ## [6] "tiempo" "alumnos" "alumnos_NEE" "asignatura" "asistente" ## [11] "instrucción" "material" ``` ] .panel[.panel-name[Primeros] Visualización de las primeras 5 encuestas realizadas al profesorado sobre la situación actual de alumnos con necesidades especiales educativas ```r head(profesores, n=5) ## # A tibble: 5 × 12 ## fecha id sexo edad nivel tiempo alumnos alumn…¹ asign…² ## <dttm> <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 2020-06-24 19:53:09 1 Masculino 36 BASI… 3 42 2 5 ## 2 2020-06-24 20:31:49 2 Femenino 31 SUPE… 2 37 1 4 ## 3 2020-06-24 21:07:19 3 Masculino 35 SUPE… 2 30 0 4 ## 4 2020-06-24 21:08:00 4 Femenino 26 INTE… 1 19 2 3 ## 5 2020-06-24 21:08:26 5 Femenino 35 SUPE… 2 25 2 4 ## # … with 3 more variables: asistente <dbl>, instrucción <dbl>, material <chr>, ## # and abbreviated variable names ¹alumnos_NEE, ²asignatura ``` ] .panel[.panel-name[Últimos] Visualización de las últimas 5 encuestas realizadas al profesorado sobre la situación actual de alumnos con necesidades especiales educativas ```r tail(profesores, n=5) ## # A tibble: 5 × 12 ## fecha id sexo edad nivel tiempo alumnos alumn…¹ asign…² ## <dttm> <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 2020-07-04 08:16:02 171 Femenino 32 SUPE… 8 42 0 3 ## 2 2020-07-05 16:23:13 172 Masculino 25 SUPE… 2 31 2 5 ## 3 2020-07-07 16:52:45 173 Femenino 39 BASI… 2 29 0 5 ## 4 2020-07-07 16:54:27 174 Femenino 39 BASI… 1 32 2 5 ## 5 2020-07-07 17:00:54 175 Masculino 52 INTE… 11 38 0 2 ## # … with 3 more variables: asistente <dbl>, instrucción <dbl>, material <chr>, ## # and abbreviated variable names ¹alumnos_NEE, ²asignatura ``` ] .panel[.panel-name[Total] ¿Cuántos alumnos con necesidades especiales educativas constan en la encuesta? ```r sum(profesores$alumnos_NEE) ## [1] 149 ``` ] .panel[.panel-name[Min] ¿Cuál es la edad del profesor más joven que llenó la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas? ```r min(profesores$edad) ## [1] 25 ``` ] .panel[.panel-name[Max] ¿Cuál es la edad del profesor mayor que llenó la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas? ```r max(profesores$edad) ## [1] 62 ``` ] .panel[.panel-name[Resumen] Genere un resumen de la variable `alumnos` de la encuesta de la situación actual del profesorado de alumnos con necesidades especiales educativas. ```r summary(profesores$alumnos) ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 18.00 26.00 33.00 32.48 39.00 45.00 ``` ] ] --- #
Listas .pull-left[ Una lista es más simple en algunos aspectos que los otros tipos, porque puedes poner cualquier cosa que tú quieras en ella utilizando la función `list()`: ```r lista <- list(1, "a", TRUE, 1+4i) lista ## [[1]] ## [1] 1 ## ## [[2]] ## [1] "a" ## ## [[3]] ## [1] TRUE ## ## [[4]] ## [1] 1+4i ``` ] .pull-right[ Observemos que los elementos de la lista se enumeran por sí solos, aunque también puedes darle nombre a cada elemento: ```r otra_lista <- list(title = "Numbers", numbers = 1:10, data = TRUE ) otra_lista ## $title ## [1] "Numbers" ## ## $numbers ## [1] 1 2 3 4 5 6 7 8 9 10 ## ## $data ## [1] TRUE ``` ] --- #
Listas ```r # [] muestra nombre y contenido del elemento 2 lista[2] ## [[1]] ## [1] "a" otra_lista[2] ## $numbers ## [1] 1 2 3 4 5 6 7 8 9 10 # [[]] muestra el contenido del elemento 2 lista[[2]] ## [1] "a" otra_lista[[2]] ## [1] 1 2 3 4 5 6 7 8 9 10 # [[]][] muestra el contenido que está en la 4ta posición del elemento 2 otra_lista[[2]][4] ## [1] 4 ``` --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA --- #
Práctica: ¡5 minutos! 1. Del conjunto de datos `profesores`: 1. Extraer toda la información del 6to encuestado. 2. Extraer la siguiente información del 5to encuestado: edad, sexo, nivel y tiempo. 3. Extrar toda la información de los encuentados que tienen 10 años o más ejerciendo la docencia. 4. Extraer el id, sexo y nivel de los profesores encuestados mayores a 40 años que estén Totalmente de acuerdo (5) que las clases serían mejor con un asistente en clase a tiempo completo. --- class: middle, center, inverse <br> <br> # Estructuras de Datos en 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) ]]