class: center, middle, titular background-size: contain <img style="border-radius: 50%;" src="img/masapp.jpg" width="250px"/> # Capítulo 2: ¿Cómo importar datos en R? ## **CAPACITACIÓN** #### LINDA CABRERA ORELLANA #### Mayo, 2023 --- .pull-left[ # Contenido del Capítulo 2 - Proceso del tidyverse - Importar datos * Importar archivos `.csv` * Importar y exportar desde Excel * Archivo SPSS, SAS, Stata * Importar desde la web * Otros archivos * Interacción con Bases de Datos - Estructuras de Datos * Vectores * Data.frames * Listas - Práctica 2 ] .pull-right[ # Paquetes a utilizar *
`library(tidyverse)` *
`library(readr)` *
`library(dplyr)` *
`library(tidyr)` *
`library(readxl)` *
`library(openxlsx)` *
`library(magrittr)` *
`library(rio)` *
`library(WDI)` ] --- ## Proceso del *tidyverse* <div class="figure" style="text-align: center"> <img src="img/proceso.png" alt="Figura 1. Proceso del tidyverse" width="100%" /> <p class="caption">Figura 1. Proceso del tidyverse</p> </div> .footnote[ [Understanding the Data Science Lifecycle](https://www.sudeep.co/data-science/2018/02/09/Understanding-the-Data-Science-Lifecycle.html) || [8 Ways to Improve Decision Making](https://www.anblicks.com/blog/8-ways-to-improve-decision-making-and-cut-cost-with-better-data-quality)] --- class: middle, center, inverse
# Importar datos --- ## Importar archivos `.csv` .pull-left[ .center[ <img src="img/readr.png" width="150px"> ] `readr` lee datos rectangulares de archivos delimitados, como valores separados por comas (CSV) y valores separados por tabuladores (TSV). `read_csv()` y `read_tsv()` son casos especiales del `read_delim()` más general. Son útiles para leer los tipos más comunes de datos de archivos sin formato, valores separados por comas y valores separados por tabulaciones, respectivamente. ] .pull-right[ Para leer un archivo `.csv` en este caso utilizaremos la función `read_delim()` del paquete `readr` que es parte del `tidyverse`. Puedes cargar el paquete `tidyverse` o el paquete `readr`, en ambos casos te habilita la función `read_delim()`. Para cargar nuestro archivo: ```r library(readr) ventas_2022 <- read_delim("datos/sri_ventas_2022.csv", delim = "|") ``` También lo podemos hacer directamente desde la **barra de herramientas**, para esto, seguimos la siguiente ruta `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="150px"> ] `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) encuesta <- read_excel("datos/encuesta.xlsx", sheet = "enc1", skip = 2) ``` También lo podemos hacer directamente desde la **barra de herramientas**, para esto, seguimos la siguiente ruta `File -> Import Dataset -> From Excel...`. ] <br> <br> <br> .footnote[ [readxl.tidyverse.org](https://readxl.tidyverse.org/) ] --- ## Importar y exportar desde Excel .pull-left[ .center[ <img src="img/openxlsx.png" width="150px"> ] `openxlsx` simplifica la creación de archivos `.xlsx` al proporcionar una interfaz de alto nivel para escribir, diseñar y editar hojas de trabajo. Mediante el uso de Rcpp, los tiempos de lectura/escritura son comparables a los paquetes `xlsx` y `XLConnect` con el beneficio adicional de eliminar la dependencia de Java. ] .pull-right[ Para leer un archivo de Excel con `openxlsx` la función a utilizar es `read_excel()` del paquete `readxl` que es parte del `tidyverse`. Para cargar nuestro archivo: ```r library(openxlsx) encuesta2 <- read.xlsx("datos/encuesta.xlsx") ``` Para exportar nuestro archivo: ```r write.xlsx(encuesta2, "datos/encuesta2.xlsx") ``` ] <br> <br> .footnote[ [openxlsx.rdocumentation.org](https://www.rdocumentation.org/packages/openxlsx/versions/4.2.5) || [ycphs.github.io/openxlsx](https://ycphs.github.io/openxlsx/index.html) ] --- ## Archivo SPSS, SAS, Stata .pull-left[ ### Importar - `library(haven)` del `tidyverse` - SPSS: `read_sav()` - SAS: `read_sas()` - STATA: `read_dta()` - Usando el paquete `foreign` - SAS: `read.xport()` - SPSS: `read.spss()` - Stata: `read.dta()` ] .pull-right[ ### Exportar - `library(haven)` del `tidyverse` - SPSS: `write_sav()` - SAS: `write_sas()` - STATA: `write_dta()` - Usango el paquete `foreign` - `write.foreign(df, datafile, codefile, package = c("SPSS", "Stata", "SAS"), ...)` ] <br> <br> <br> .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. El objetivo de `rio` es hacer que la E/S de archivos de datos en R sea lo más fácil posible mediante la implementación de cuatro funciones simples al estilo de una navaja suiza. ] .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/Can2019.xlsx" # 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 - GoogleSpreadSheets con `googlesheets`. Ver guía en: [https://rpubs.com/med11/GoogleDriveAndR](https://rpubs.com/med11/GoogleDriveAndR) - GIS sistemas de información geográfica con `rgal` y `raster`. - JSON data con `rjson` o `jsonlite` o `RJSONIO`. JSON es la abreviatura de la notación de objetos de JavaScript (JavaScript Object Notation) y no es más que uno tantos textos simples que se crearon como un subconjunto de JavaScript, pero dada su versatilidad, rápidamente fue considerado como un lenguaje independiente, situándose como una alternativa al clásico XML - `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: [Sociedad_Ecuatoriana_Estadistica](https://www.youtube.com/watch?v=s1QnGTk0x8U&list=PL2PpISw8vp_oJlVXpYYowclogCCLtEOfX). --- ## Interacción con Bases de Datos - Utilizando ODBC `RODBC` (Recomendado para Microsoft SQL). ODBC es la parte de base de datos de la Arquitectura de servicios abiertos de Microsoft Windows (WOSA), una interfaz que permite que las aplicaciones de escritorio basadas en Windows se conecten a varios entornos de computación sin tener que volver a crear la aplicación para cada plataforma. - Utilizando JDBC `RJDBC` (Usa java DBC). (Java Database Connectivity) Se conoce por formar parte de las herramientas manipuladas por Hive, la herramienta de Data Warehousing y ETL (Extract, Transform and Load) construida para funcionar sobre Hadoop. - Paquetes para bases específicas `RMySQL`, `ROracle`, `RPostgreSQL`, `RSQLite`, `mongolite`, `RMongo`, `MonetDB.R`, `rmongodb`. --- class: middle, center, inverse
# Estructuras de Datos --- ## Estructuras de datos - Objetos Las estructuras de datos más usadas son: - Vector - Matriz - Data.frame o Tibble - Listas - Series de tiempo - Data.table --- ## 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()`. A continuación creamos un vector de 4 elementos de tipo numérico: ```r y <- c(11, 13, 15, 20) ``` ] .pull-right[ Con la función `is.vector()` identificamos que el objeto corresponde a un vector: ```r is.vector(y) ## [1] TRUE y # imprimir el contenido del objeto ## [1] 11 13 15 20 ``` 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[ 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[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 # extraigo el segundo elemento del vector w w[2] ## [1] 5 # imprimo el vector w, excepto su tercer elemento w[-3] ## [1] 2 5 8 ``` ] --- ## 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 la misma **longitud** Las _filas_ se denominan **observaciones** y las _columnas_ se denominan **variables**. ] .pull-right[ .center[ <img src="img/dataframe.png" width="700px"> Artwork by @allison_horst ] ] --- ## Data.frames .pull-left[ ### Crear un data.frame `data.frame()` crea data.frames a partir de la unión de 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 ``` ] --- ## Data.frames .pull-left[ ### Seleccionar elementos Al igual que los vectores podemos seleccionar elementos de un data.frame con la ayuda de corchetes `[]`. Al usar una coma, puede indicar qué seleccionar de las filas y las columnas respectivamente. Por ejemplo, supongamos que queremos extraer la edad de David Mieles: .center[ <img src="img/dataframe2.png" width="750px"> ] ] .pull-right[ La edad de David Mieles se ubica en la fila 3 y la columna 2: ```r pacientes[3,2] ## [1] 27 ``` ### Otros usos - `nombre_dataframe[1,2]` selecciona el valor en la primera fila y la segunda columna en `nombre_dataframe`. - `nombre_dataframe[1:3,2:4]` selecciona las filas 1, 2, 3 y las columnas 2, 3, 4 en `nombre_dataframe`. - A veces desea seleccionar todos los elementos de una fila o columna. Por ejemplo, `nombre_dataframe[1, ]` selecciona todos los elementos de la primera fila. ] --- ## Data.frames .pull-left[ ### Seleccionar columnas También podemos consultar a R por los valores de una columna entera de nuestro data set con el símbolo `$`. ```r pacientes$nombres ## [1] "Marcela Cox" "Luis Vargas" "David Mieles" ``` Y aplicar una función a esa columna: ```r mean(pacientes$edades) ## [1] 27.66667 ``` ] .pull-right[ ### Ordenando elementos En el análisis de datos, puede ordenar sus datos de acuerdo con una determinada variable en el conjunto de datos. `order()` es una función que le da la posición clasificada de cada elemento cuando se aplica a una variable, como un vector, por ejemplo: ```r ## podemos ordenar los elementos de vectores order(pacientes$edades) ## [1] 1 3 2 ## podemos ordenar los elementos de la columna de un data.frame pacientes[order(edades),] ## nombres edades seguro ## 1 Marcela Cox 24 IESS ## 3 David Mieles 27 IESS ## 2 Luis Vargas 32 BMI ``` ] --- ## Funciones básicas para explorar data.frames .pull-left[ * **`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. ] --- ## 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-image: url("img/estructuras.png") background-size: contain --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 2 --- #
Práctica: ¡10 minutos! 1. Revise la estructura del conjunto de datos `ventas2022`. Asegúrese que el objeto haya sido cargado previamente en Environment. Convierta el objeto a un data.frame y cámbiele el nombre a `ventas`. 2. Revise los nombres de las variables del conjunto de datos `ventas`. 3. Visualice las primeras 10 observaciones. 4. Visualice las 8 últimas observaciones. 5. Efectúe un resumen de estadísticas básicas. 6. Extraiga las 100 primeras observaciones que muestre las columnas de la provincia, cantón y las ventas. 7. Extraiga toda la columna del total de ventas. 8. Extraiga toda la información de la observación 55. --- class: middle, center, inverse <br> <br> # ¿Cómo importar datos en R? ## **CAPÍTULO 2** <br> <br> .center[ ### [@MasappEC
](https://www.facebook.com/MasappEC/) ### [@Masappdata
](https://twitter.com/Masappdata) ]