class: center, middle, titular background-size: contain <img style="border-radius: 50%;" src="img/masapp.jpg" width="250px"/> # Capítulo 2: Importación y Manipulación de Datos en R ## **CAPACITACIÓN** #### LINDA CABRERA ORELLANA<br>FERNANDA JURADO MANTILLA #### Noviembre, 2022 --- # Contenido del Capítulo 2 .pull-left[ - Proceso del tidyverse - Importar datos * Importar archivos `.csv` * Importar y exportar desde Excel * Otros archivos - Estructuras de datos * Vectores * Data.frames (Tibbles) * Funciones básicas * Práctica 2.1 - Tipos de datos * Numéricos * Cadena de caracteres * Factores * Fechas y Horas * Práctica 2.2 ] .pull-right[ - Datos relacionales con `dplyr` * Operador pipe `%>%` * Mutating joins * Filtering joins * Set operations * Práctica 2.3 - Datos ordenados con `tidyr` * Ordenar datos a lo largo * Ordenar datos a lo ancho * Práctica 2.4 - Transformación de datos con `dplyr` * Modificar el nombre de las variables * Seleccionar o descartar variables * Filtrar observaciones * Agregar o editar variables * Resumir información * Agrupar o segmentar datos ] --- ## 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)] --- ## Paquetes a utilizar *
`library(tidyverse)` *
`library(readr)` *
`library(dplyr)` *
`library(tidyr)` *
`library(readxl)` *
`library(openxlsx)` *
`library(lubridate)` *
`library(magrittr)` *
`library(datos)` --- 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) ] --- ## Otros archivos .pull-left[ ### Importar - `library(haven)` del `tidyverse` - SPSS: `read_sav()` - SAS: `read_sas()` - STATA: `read_dta()` - Desde la **barra de herramientas**, seguimos la siguiente ruta `File -> Import Dataset -> From Excel...` - GoogleSpreadSheets con `googlesheets` ] .pull-right[ - `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). <br> ### Exportar - `library(haven)` del `tidyverse` - SPSS: `write_sav()` - SAS: `write_sas()` - STATA: `write_dta()` ] <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. ] .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. --> --- 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. ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 2.1 --- ##
Práctica 2.1 1. Revise la estructura del conjunto de datos `ventas_2022`. 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
# Tipos de Datos --- <div class="figure" style="text-align: center"> <img src="img/tiposdatos.png" alt="Figura 2. Tipos de datos en R" width="100%" /> <p class="caption">Figura 2. Tipos de datos en R</p> </div> --- ## Datos Numéricos .pull-left[ Para determinar el tipo de dato de un data set aplicamos la función `class()`. ```r # clase de un vector de 1 elemento class(5) ## [1] "numeric" # clase de la columna edades del dataset pacientes class(pacientes$edades) ## [1] "numeric" ``` Ahora, el vector `\(z\)` de tipo caracter lo convertiremos en tipo numérico. ```r z ## [1] "1" "5" "11" "14" class(z) ## [1] "character" ``` ] .pull-right[ ### Con `as.numeric()`. ```r # cambio de clase caracter a numérico con as.numeric() class(as.numeric(z)) ## [1] "numeric" ``` ### Con `parse_number()`. ```r library(readr) # cambio de clase caracter a numérico con parse_number() class(parse_number(z)) ## [1] "numeric" ``` ] --- ## Datos Numéricos .pull-left[ **`parse_number()`** es muy útil para resolver problemas de decimales, caracteres que acompañan a números y caracteres de agrupación. En R, por default, el decimal es el punto. A continuación, tiene dos argumentos que le pueden servir de ayuda: - `grouping_mark` para especificar el signo de agrupación; - `decimal_mark` para especificar el decimal a cambiar. ```r parse_number("6'789,56", locale = locale(grouping_mark = "'", decimal_mark = ",")) ## [1] 6789.56 ``` ] .pull-right[ También sirve para extraer números insertos en texto. ```r parse_number("$100") ## [1] 100 parse_number("20%") ## [1] 20 parse_number("It cost $123.45") ## [1] 123.45 parse_number("$123.456.789", locale = locale(grouping_mark = ".")) ## [1] 123456789 ``` ] --- <!-- ## Cadena de Caracteres .pull-left[ `readr` asume que tus datos están codificados en UTF-8. `charToRaw():` realiza una representación subyacente de una cadena de texto. ```r charToRaw("Linda") ## [1] 4c 69 6e 64 61 ``` ¿Qué sucede cuando tus datos producidos no entienden UTF-8? ```r library(readr) x1 <- "El Ni\xf1o was particularly bad this year" ``` ] .pull-right[ Para corregir el problema necesitas especificar la codificación en **`parse_character()`**: ```r parse_character(x1, locale = locale(encoding = "Latin1")) ## [1] "El Niño was particularly bad this year" ``` ¿Cómo encontrar la codificación correcta? Con `guess_encoding()` ```r guess_encoding(charToRaw(x1)) ## # A tibble: 2 × 2 ## encoding confidence ## <chr> <dbl> ## 1 ISO-8859-1 0.46 ## 2 ISO-8859-9 0.23 ``` ] .footnote[ [Tablas de codificación de caracteres](http://www.atc.uniovi.es/tablas.php)] ## Cadena de Caracteres .pull-left[ .center[ <img src="img/stringr.png" width="200px"> ] `stringr` proporciona un conjunto cohesivo de funciones diseñadas para trabajar de forma más fácil con cadenas de caracteres. ```r library(stringr) ``` ] .pull-right[ ```r frase <- "Esta es una cadena de caracteres" class(frase) ## [1] "character" ``` `str_length()` indica el número de caracteres de una cadena. ```r str_length(frase) ## [1] 32 ``` `str_c()` combina dos o más cadenas: ```r str_c(frase, " y esto también") ## [1] "Esta es una cadena de caracteres y esto también" ``` ] --> ## Cadena de Caracteres .pull-left[ Para convertir datos a tipo caracter usamos la función `as.character()`: ```r pacientes ## nombres edades seguro ## 1 Marcela Cox 24 IESS ## 2 Luis Vargas 32 BMI ## 3 David Mieles 27 IESS class(pacientes$seguro) ## [1] "factor" ## convertir de factor a tipo caracter pacientes$seguro <- as.character(pacientes$seguro) class(pacientes$seguro) ## [1] "character" ``` ] .pull-right[ Convertimos un dato tipo fecha a tipo caracter: ```r ## consultamos la función now() y su clase lubridate::now() ## [1] "2022-11-21 14:53:06 -05" class(lubridate::now()) ## [1] "POSIXct" "POSIXt" ## convertimos a tipo caracter as.character(lubridate::now()) ## [1] "2022-11-21 14:53:06" class(as.character(lubridate::now())) ## [1] "character" ``` ] <br> <br> .footnote[ [stringr.tidyverse.org](https://stringr.tidyverse.org/) || [tidyverse/reprex](https://github.com/tidyverse/reprex)] --- ## Factores <!-- .pull-left[ .center[ <img src="img/forcats.png" width="200px"> ] `forcats` proporciona un conjunto de herramientas que resuelven problemas comunes con factores. ```r library(forcats) ``` ] --> .pull-left[ Imaginemos que tenemos la siguiente variable que registra meses: ```r fc1 <- c("Dic", "Abr", "Ene", "Mar") class(fc1) ## [1] "character" ``` Si trabajamos esta variable en tipo caracter, tendremos 2 problemas: 1. Errores de tipeo, 2. No se ordena de una forma útil. Estos problemas se solucionan trabajando con factores. ] .pull-right[ Para crear un factor con **`factor()`** debes: 1. Definir una lista de niveles válidos. ```r niveles_meses <- c("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic") ``` 2. Ahorar puedes crear un factor. ```r y1 <- factor(fc1, levels = niveles_meses) class(y1) ## [1] "factor" # para acceder a los niveles del factor levels(y1) ## [1] "Ene" "Feb" "Mar" "Abr" "May" "Jun" "Jul" "Ago" "Sep" "Oct" "Nov" "Dic" ``` ] <br> .footnote[ [forcats.tidyverse.org](https://forcats.tidyverse.org/) || [Wrangling categorical data in R](https://peerj.com/preprints/3163/) || [stringsAsFactors = <sigh>](https://notstatschat.tumblr.com/post/124987394001/stringsasfactors-sigh) ] --- ## Fechas y Horas .pull-left[ **`parse_datetime()`** asume una fecha-hora ISO8601, estándar internacional en el que los componentes de una fecha están organizados de mayor a menor: año, mes, día, hora, minuto, segundo. ```r # Dato de fecha-hora fecha1 <- "2010-10-01T2010" parse_datetime(fecha1) ## [1] "2010-10-01 20:10:00 UTC" # Si se omite la hora, será determinada como medianoche. fecha2 <- "20101010" parse_datetime(fecha2) ## [1] "2010-10-10 UTC" ``` ] .pull-right[ **`parse_date()`** asume aaaa-mm-dd o aaaa/mm/dd. ```r fecha3 <- "2010-10-01" parse_date(fecha3) ## [1] "2010-10-01" ``` **`parse_time()`** espera la hh:mm:ss, los segundos y el especificador am/pm son opcionales. ```r library(hms) parse_time("01:10 am") ## 01:10:00 parse_time("20:10:01") ## 20:10:01 ``` ] <br> <br> .footnote[ [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) || [hms.tidyverse.org](https://hms.tidyverse.org/)] --- ## Fechas y Horas .pull-left[ .center[ <img src="img/lubridate.png" width="200px"> ] `lubridate` hace que sea más fácil hacer las cosas que hace R con fecha y hora y hace posible hacer las cosas que R base no hace. ```r library(lubridate) ``` ] .pull-right[ Hay tres tipos de datos de fechas/horas que se refieren a un instante en el tiempo: * Una fecha o `date`. * Una hora o `time` dentro de un día. * Una fecha-hora o date-time `dttm` (llamado también `POSIXct`). Para obtener la fecha o fecha-hora actual utiliza `today()` o `now()`: ```r today() ## [1] "2022-11-21" now() ## [1] "2022-11-21 14:53:07 -05" ``` ] <br> .footnote[ [lubridate.tidyverse.org](https://lubridate.tidyverse.org/) || [hms.tidyverse.org](https://hms.tidyverse.org/) ] --- ## Fechas y Horas .pull-left[ Hay tres modos en los que puedes crear una fecha/hora: * Desde una cadena de caracteres (o string, en inglés). * Desde componentes de fecha-hora individuales. * Desde un objeto fecha-hora existente. ### Desde cadenas de caracteres ```r ymd("2017-01-31") ## [1] "2017-01-31" ymd("20170131") ## [1] "2017-01-31" ``` ] .pull-right[ ```r mdy("01-31-2017") ## [1] "2017-01-31" mdy("01312017") ## [1] "2017-01-31" dmy("31-01-2017") ## [1] "2017-01-31" dmy("31012017") ## [1] "2017-01-31" mdy_hm("01/31/2017 08:01") ## [1] "2017-01-31 08:01:00 UTC" ymd_hms("2017-01-31 20:11:59") ## [1] "2017-01-31 20:11:59 UTC" ``` ] --- ## Fechas y Horas .pull-left[ ### Desde componentes individuales Crearé un data.frame donde las fechas y las horas están repartidos en diferentes columnas. ```r ejemplo <- data.frame(anio= c(1994, 1992, 1987), dia= c(21, 02, 15), mes= c(02, 04, 05), hora= c(20, 14, 09), minuto= c(45, 30, 15)) ejemplo ## anio dia mes hora minuto ## 1 1994 21 2 20 45 ## 2 1992 2 4 14 30 ## 3 1987 15 5 9 15 ``` ] .pull-right[ `make_date()` para crear fecha. ```r # forma fecha que contiene dia, mes y anio make_date(ejemplo$anio, ejemplo$mes, ejemplo$dia) ## [1] "1994-02-21" "1992-04-02" "1987-05-15" ``` `make_datetime()` para crear fecha-hora. ```r # forma fecha-hora make_datetime(ejemplo$anio, ejemplo$mes, ejemplo$dia, ejemplo$hora, ejemplo$minuto) ## [1] "1994-02-21 20:45:00 UTC" "1992-04-02 14:30:00 UTC" ## [3] "1987-05-15 09:15:00 UTC" ``` ### Desde otros tipos ```r as_datetime(today()) as_date(now()) ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 2.2 --- ##
Práctica 2.2 1. Modificar el tipo de dato de las variables _"VENTAS_NETAS_TARIFA_12", "VENTAS_NETAS_TARIFA_0", "EXPORTACIONES", "COMPRAS_ENTAS_TARIFA_12", "COMPRAS_NETAS_TARIFA_0", "IMPORTACIONES", "COMPRAS_RISE"_. 2. Crear una nueva columna con la función `dplyr::mutate()` que indique la fecha en el formato (YYYY-MM-DD). 3. Convertir los meses en un vector tipo factor y modificar los niveles al nombre abreviado de cada mes. --- class: middle, center, inverse
# Datos Relacionales con `dplyr` --- ## 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 `%>%`. ```r dataset %>% funcion1() %>% funcion2() %>% funcion3() ``` ] <br> .footnote[ [magrittr.tidyverse.org](https://magrittr.tidyverse.org/) ] --- .center[ ![](https://erikgahner.dk/img/2022/R_pipe.gif) ] --- ## Datos relacionales con `dplyr` .pull-left[La mayor parte del tiempo, nos vienen muchas tablas de información que debemos combinar para responder a nuestras preguntas de interés, a esto se le llama **datos relacionales**. Para trabajar con datos relacionales necesitas verbos que funcionen con pares de tablas y para esto existen tres familias de verbos diseñadas para trabajar con datos relacionales que son las 1) **uniones de transformación** (_mutating joins_), 2) **uniones de filtro** (_filtering joins_) y 3) **operaciones de conjuntos** (_set operations_). El lugar más común para encontrar datos relacionales es en un **sistema relacional de administración de bases de datos** (_Relational Data Base Management System_ en inglés), un concepto que abarca casi todas las bases de datos modernas. ] .pull-right[Una de las formas de mostrar las relaciones entre las diferentes tablas es mediante un diagrama: <img src="img/diagrama.png" width="100%" style="display: block; margin: auto;" /> ] --- ## Mutating joins Las **uniones de transformación** (del inglés _mutating joins_) agregan nuevas variables a un data frame a partir de las observaciones coincidentes en otra tabla. En las uniones de transformación tenemos algunos tipos de uniones: <div class="figure" style="text-align: center"> <img src="img/mutating.png" alt="Figura 3. Tipos de mutating joins" width="100%" /> <p class="caption">Figura 3. Tipos de mutating joins</p> </div> --- ## Mutating joins Para entender el `inner_join`, `left_join()`, `right_join()` y `full_join()`, vamos a crear los siguientes data frames: .pull-left[ ```r df_1 <- data.frame(Nombre= c('Belén', 'Noé', 'Salvador', 'Anne', 'Pablo', 'Rafaela', 'Victoria'), Edad = c(22,18,21,26,25,23,21), Ciudad= factor(c('Gye', 'Uio', 'Cue', 'Gye', 'Cue', 'Uio', 'Cue')) ) df_1 ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Noé 18 Uio ## 3 Salvador 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ## 6 Rafaela 23 Uio ## 7 Victoria 21 Cue ``` ] .pull-right[ ```r df_2 <- data.frame( A= c('Ana', 'Belén','Jose', 'Anne', 'Luis'), B= c(100,200,300,200,250), C= c('Soltera','Soltera','Casado','Divorciada','Soltero')) df_2 ## A B C ## 1 Ana 100 Soltera ## 2 Belén 200 Soltera ## 3 Jose 300 Casado ## 4 Anne 200 Divorciada ## 5 Luis 250 Soltero ``` ] --- ## Mutating joins .pull-left[ ### `inner_join()` Muestra las observaciones cuyas claves coinciden en ambos conjuntos de datos: ```r df_1 %>% inner_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Anne 26 Gye 200 Divorciada ``` ] .pull-right[ ### `left_join()` Muestra las observaciones del conjunto de la izquierda pero añade los datos del conjunto de la derecha, coincidan o no coincidan. Si no coinciden, se agregan con NA. ```r df_1 %>% left_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Noé 18 Uio NA <NA> ## 3 Salvador 21 Cue NA <NA> ## 4 Anne 26 Gye 200 Divorciada ## 5 Pablo 25 Cue NA <NA> ## 6 Rafaela 23 Uio NA <NA> ## 7 Victoria 21 Cue NA <NA> ``` ] --- ## Mutating joins .pull-left[ ### `right_join()` Muestra las observaciones del conjunto de la derecha pero añade los datos del conjunto de la izquierda, coincidan o no coincidan. Si no coinciden, se agregan con NA. ```r df_1 %>% right_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Anne 26 Gye 200 Divorciada ## 3 Ana NA <NA> 100 Soltera ## 4 Jose NA <NA> 300 Casado ## 5 Luis NA <NA> 250 Soltero ``` ] .pull-right[ ### `full_join()` Muestra las observaciones de ambos conjuntos de datos, cuando los datos no coinciden, se agregan con NA. ```r df_1 %>% full_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad B C ## 1 Belén 22 Gye 200 Soltera ## 2 Noé 18 Uio NA <NA> ## 3 Salvador 21 Cue NA <NA> ## 4 Anne 26 Gye 200 Divorciada ## 5 Pablo 25 Cue NA <NA> ## 6 Rafaela 23 Uio NA <NA> ## 7 Victoria 21 Cue NA <NA> ## 8 Ana NA <NA> 100 Soltera ## 9 Jose NA <NA> 300 Casado ## 10 Luis NA <NA> 250 Soltero ``` ] --- ## Filtering joins Las **uniones de filtro** (del inglés _filtering joins_) filtran observaciones en un data frame con base en si coinciden o no con una observación de otra tabla. .pull-left[ ### `semi_join()` Muestra las observaciones del conjunto de la izquierda que tiene coincidencias con el conjunto de la derecha: ```r df_1 %>% semi_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Anne 26 Gye ``` ] .pull-right[ ### `anti_join()` Muestra las observaciones del conjunto de la izquierda que no tiene coincidencias con el conjunto de la derecha: ```r df_1 %>% anti_join(df_2, by = c("Nombre"="A")) ## Nombre Edad Ciudad ## 1 Noé 18 Uio ## 2 Salvador 21 Cue ## 3 Pablo 25 Cue ## 4 Rafaela 23 Uio ## 5 Victoria 21 Cue ``` ] --- ## Set operations Las **operaciones de conjuntos** (del inglés _set operations_) tratan las observaciones como elementos de un conjunto. Las comparaciones se realizan entre conjuntos que contengan las mismas columnas, pues se revisa cómo difieren las observaciones entre los conjuntos, para esto, revisaremos las funciones `intersect()`, `union()` y `setdiff()`. Para ejemplificar esta parte crearemos el data.frame `df3`. .pull-left[ ```r df_3 <- data.frame(Nombre= c('Belén', 'Noé', 'María', 'Anne', 'Pablo'), Edad = c(22,18,21,26,25), Ciudad= factor(c('Cue', 'Uio', 'Cue', 'Gye', 'Cue'))) df_3 ## Nombre Edad Ciudad ## 1 Belén 22 Cue ## 2 Noé 18 Uio ## 3 María 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ``` ] .pull-right[ ### `intersect()` Devuelve las observaciones comunes entre ambos conjuntos. ```r intersect(df_1, df_3) ## Nombre Edad Ciudad ## 1 Noé 18 Uio ## 2 Anne 26 Gye ## 3 Pablo 25 Cue ``` ] --- ## Set operations .pull-left[ ### `union()` Devuelve las observaciones únicas en ambos conjuntos, es decir que no see repiten en ningun de los dos conjuntos. ```r union(df_1, df_3) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Noé 18 Uio ## 3 Salvador 21 Cue ## 4 Anne 26 Gye ## 5 Pablo 25 Cue ## 6 Rafaela 23 Uio ## 7 Victoria 21 Cue ## 8 Belén 22 Cue ## 9 María 21 Cue ``` ] .pull-right[ ### `setdiff()` Devuelve las observaciones en el primer conjunto pero que son diferentes del segundo conjunto. ```r setdiff(df_1, df_3) ## Nombre Edad Ciudad ## 1 Belén 22 Gye ## 2 Salvador 21 Cue ## 3 Rafaela 23 Uio ## 4 Victoria 21 Cue ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 2.3 --- ##
Práctica 2.3 1. Cargue a R, la hoja `ciiu_1level` del archivo denominado `CIIU.xls`. _CIIU_ es la Clasificación Nacional de Actividades Económicas. 2. ¿Qué join necesitamos realizar en nuestros datos `ventas` para que aparezca el nombre del tipo de actividad? Efectúelo. --- class: middle, center, inverse
# 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. <br> <div class="figure" style="text-align: center"> <img src="img/tidy_data.png" alt="Figura 4: Reglas que hacen que un conjunto de datos sea ordenado" width="1000" /> <p class="caption">Figura 4: Reglas que hacen que un conjunto de datos sea ordenado</p> </div> --- ## Funciones del paquete `tidyr` <br> <br> <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> <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) ## ## Attaching package: 'datos' ## The following object is masked _by_ '.GlobalEnv': ## ## nombres 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 ``` ] --- background-color: var(--azul-claro) class: middle, center, inverse
## PRÁCTICA 2.4 --- ##
Práctica 2.4 1. ¿Qué tipo de pivoteo aplicarías al conjunto de datos `ventas` para que éste sea un data.frame ordenado? ¿Por qué? 2. Corrija el conjunto de datos y guárdelo en un nuevo objeto llamado `tidy_ventas`. --- class: middle, center, inverse
# 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> <br> <br> <br> <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, columnas... ) ``` Cambiando el nombre de las variables: ```r ventas <- ventas %>% rename(anio=ANIO, mes=MES, provincia=PROVINCIA, canton=CANTON, VN_tar12=VENTAS_NETAS_TARIFA_12, VN_tar0=VENTAS_NETAS_TARIFA_0, CN_tar12=COMPRAS_ENTAS_TARIFA_12, CN_tar0=COMPRAS_NETAS_TARIFA_0, fecha=Fecha, sector= DESCRIPCION) ``` --- ## Seleccionar o descartar variables **`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... ) ``` Selecciono las variables que deseo del conjunto de datos `tidy_ventas`, mantendrá el orden que yo indique en la selección: ```r tidy_ventas <- tidy_ventas %>% select(ANIO, MES, PROVINCIA, CANTON, DESCRIPCION, transaccion, monto) ``` --- ## Seleccionar o descartar variables Otra forma de seleccionar es _deseleccionando_ las variables que no deseo del conjunto de datos `ventas`: ```r ventas <- ventas %>% select(mes, provincia, canton, VN_tar12, VN_tar0, EXPORTACIONES, CN_tar12, CN_tar0, IMPORTACIONES, COMPRAS_RISE, -anio,-CODIGO_SECTOR_N1,-TOTAL_COMPRAS,-TOTAL_VENTAS) ``` --- ## Filtrar observaciones Por si deseas combinar condiciones aquí tienes una lista de operadores de comparación y operadores lógicos: .pull-left[ <br> | Operadores de comparación | Acción | |:--------:|:--------------| | == | igual | | %in% | incluye | | != | diferente | | > | mayor que | | >= | mayor o igual que | | < | menor que | | <= | menor o igual que | ] .pull-right[ <br> | Operadores lógicos | Acción | |:--------:|:--------------| | & | y - Cuando se cumplen ambas condiciones | | | | o - Cuando se cumple una u otra condición | ] --- ## Filtrar observaciones Vamos a delimitar el universo a las transacciones de `tidy_ventas` cuyo monto sea diferente de cero con **`filter()`**, es decir eliminaremos del conjunto de datos `tidy_ventas` cuyas transacciones sean igual a cero. ```r tidy_ventas %>% filter(monto != 0) ## # A tibble: 127,444 × 7 ## ANIO MES PROVINCIA CANTON DESCRIPCION trans…¹ monto ## <dbl> <fct> <chr> <chr> <chr> <chr> <dbl> ## 1 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. VENTAS… 3.77e3 ## 2 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. COMPRA… 1.94e4 ## 3 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. COMPRA… 1.50e3 ## 4 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… VENTAS… 8.04e3 ## 5 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… VENTAS… 5.61e7 ## 6 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… EXPORT… 4.60e7 ## 7 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… COMPRA… 4.34e7 ## 8 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… COMPRA… 8.83e7 ## 9 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… IMPORT… 6.62e6 ## 10 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR Y AL P… COMPRA… 6.88e5 ## # … with 127,434 more rows, and abbreviated variable name ¹transaccion tidy_ventas <- tidy_ventas %>% filter(monto != 0) ``` --- ## Filtrar observaciones Vamos a delimitar nuestros datos de `tidy_ventas` a las transacciones por concepto de exportaciones e importaciones. ```r tidy_ventas %>% filter(transaccion %in% c("EXPORTACIONES", "IMPORTACIONES")) ## # A tibble: 9,875 × 7 ## ANIO MES PROVINCIA CANTON DESCRIPCION trans…¹ monto ## <dbl> <fct> <chr> <chr> <chr> <chr> <dbl> ## 1 2022 Abr EL ORO "MACHALA" COMERCIO AL POR MAYOR Y… EXPORT… 4.60e7 ## 2 2022 Abr EL ORO "MACHALA" COMERCIO AL POR MAYOR Y… IMPORT… 6.62e6 ## 3 2022 Jul GUAYAS "GUAYAQUIL" COMERCIO AL POR MAYOR Y… EXPORT… 2.51e8 ## 4 2022 Jul GUAYAS "GUAYAQUIL" COMERCIO AL POR MAYOR Y… IMPORT… 4.60e8 ## 5 2022 Ene TUNGURAHUA "AMBATO" CONSTRUCCIÓN. IMPORT… 7.02e5 ## 6 2022 Mar PICHINCHA "QUITO" BAJO RELACION DE DEPEND… EXPORT… 1.07e6 ## 7 2022 Mar PICHINCHA "QUITO" BAJO RELACION DE DEPEND… IMPORT… 7.36e6 ## 8 2022 Sep PICHINCHA "RUMI\xd1AHUI" INFORMACIÓN Y COMUNICAC… EXPORT… 1.36e4 ## 9 2022 Sep PICHINCHA "RUMI\xd1AHUI" INFORMACIÓN Y COMUNICAC… IMPORT… 3.25e5 ## 10 2022 Mar PICHINCHA "QUITO" CONSTRUCCIÓN. EXPORT… 2.90e5 ## # … with 9,865 more rows, and abbreviated variable name ¹transaccion ``` --- ## Filtrar observaciones Vamos a delimitar nuestros datos de `tidy_ventas` a las transacciones por concepto de exportaciones e importaciones de la provincia del Pichincha. ```r tidy_ventas %>% filter((transaccion %in% c("EXPORTACIONES", "IMPORTACIONES")) & PROVINCIA=="PICHINCHA") ## # A tibble: 998 × 7 ## ANIO MES PROVINCIA CANTON DESCRIPCION trans…¹ monto ## <dbl> <fct> <chr> <chr> <chr> <chr> <dbl> ## 1 2022 Mar PICHINCHA "QUITO" BAJO RELACION DE DEPENDE… EXPORT… 1.07e6 ## 2 2022 Mar PICHINCHA "QUITO" BAJO RELACION DE DEPENDE… IMPORT… 7.36e6 ## 3 2022 Sep PICHINCHA "RUMI\xd1AHUI" INFORMACIÓN Y COMUNICACI… EXPORT… 1.36e4 ## 4 2022 Sep PICHINCHA "RUMI\xd1AHUI" INFORMACIÓN Y COMUNICACI… IMPORT… 3.25e5 ## 5 2022 Mar PICHINCHA "QUITO" CONSTRUCCIÓN. EXPORT… 2.90e5 ## 6 2022 Mar PICHINCHA "QUITO" CONSTRUCCIÓN. IMPORT… 7.11e6 ## 7 2022 Abr PICHINCHA "QUITO" ACTIVIDADES FINANCIERAS … EXPORT… 1.63e6 ## 8 2022 Abr PICHINCHA "QUITO" ACTIVIDADES FINANCIERAS … IMPORT… 1.08e4 ## 9 2022 Jul PICHINCHA "QUITO" BAJO RELACION DE DEPENDE… EXPORT… 6.85e5 ## 10 2022 Jul PICHINCHA "QUITO" BAJO RELACION DE DEPENDE… IMPORT… 9.76e6 ## # … with 988 more rows, and abbreviated variable name ¹transaccion ``` --- ## Filtrar observaciones Vamos a delimitar nuestros datos de `tidy_ventas` a las transacciones por concepto de exportaciones e importaciones de la provincia del Pichincha cuyos montos sean mayores a `\(600,000\)`. ```r tidy_ventas %>% filter((transaccion %in% c("EXPORTACIONES", "IMPORTACIONES")) & PROVINCIA=="PICHINCHA" & monto > 600000) ## # A tibble: 353 × 7 ## ANIO MES PROVINCIA CANTON DESCRIPCION trans…¹ monto ## <dbl> <fct> <chr> <chr> <chr> <chr> <dbl> ## 1 2022 Mar PICHINCHA QUITO BAJO RELACION DE DEPENDENCIA SEC… EXPORT… 1.07e6 ## 2 2022 Mar PICHINCHA QUITO BAJO RELACION DE DEPENDENCIA SEC… IMPORT… 7.36e6 ## 3 2022 Mar PICHINCHA QUITO CONSTRUCCIÓN. IMPORT… 7.11e6 ## 4 2022 Abr PICHINCHA QUITO ACTIVIDADES FINANCIERAS Y DE SEG… EXPORT… 1.63e6 ## 5 2022 Jul PICHINCHA QUITO BAJO RELACION DE DEPENDENCIA SEC… EXPORT… 6.85e5 ## 6 2022 Jul PICHINCHA QUITO BAJO RELACION DE DEPENDENCIA SEC… IMPORT… 9.76e6 ## 7 2022 Abr PICHINCHA QUITO ACTIVIDADES DE ATENCIÓN DE LA SA… EXPORT… 6.25e5 ## 8 2022 Feb PICHINCHA QUITO COMERCIO AL POR MAYOR Y AL POR M… EXPORT… 3.24e7 ## 9 2022 Feb PICHINCHA QUITO COMERCIO AL POR MAYOR Y AL POR M… IMPORT… 4.74e8 ## 10 2022 Jul PICHINCHA QUITO COMERCIO AL POR MAYOR Y AL POR M… EXPORT… 3.57e7 ## # … with 343 more rows, and abbreviated variable name ¹transaccion ``` --- ## Agregar o editar variables Con **`mutate()`** agregaremos dos variables al conjunto de datos `ventas` que corresponden al TOTAL DE COMPRAS y TOTAL DE VENTAS. ```r ventas <- ventas %>% mutate(TOTAL_COMPRAS=round(CN_tar12+CN_tar0+IMPORTACIONES+COMPRAS_RISE,2), TOTAL_VENTAS=round(VN_tar0+VN_tar12,2)) ``` --- ## Agregar o editar variables Con **`mutate()`** agregaremos al conjunto de datos `tidy_ventas` una columna que contenga el monto del IVA de compras y ventas gravados con tarifa 12 %, de acuerdo a las transacciones. Para efectuar este requerimiento necesitamos conocer 2 nuevas funciones: * `case_when()` Permite definir una variable, de forma tal que tome un valor particular para cada condición establecida. En caso de no cumplir con ninguna de las condiciones establecidas, la variable tomará valor `NA`. La sintaxis de la función es: ```r # Valores no especificados por default NA case_when(condicion_logica1 ~ valor asignado1, condicion_logica2 ~ valor asignado2) # Se pueden especificar condiciones restantes case_when(condicion_logica1 ~ valor asignado1, condicion_logica2 ~ valor asignado2, TRUE ~ valor asignado3) ``` * `round()` redondeo valores numéricos. La sintaxis de la función es: ```r # Valores no especificados por default NA round(valor_numerico, numero_decimales) ``` --- ## Agregar o editar variables ¡AHORA SÍ! Con **`mutate()`** agregaremos al conjunto de datos `tidy_ventas` una columna que contenga el monto del IVA de compras y ventas gravados con tarifa 12%, de acuerdo a las transacciones. ```r tidy_ventas %>% mutate(IVA = case_when(transaccion=="COMPRAS_ENTAS_TARIFA_12" ~ round((monto*0.12),2), transaccion=="VENTAS_NETAS_TARIFA_12" ~ round((monto*0.12),2), TRUE ~ 0)) ## # A tibble: 127,444 × 8 ## ANIO MES PROVINCIA CANTON DESCRIPCION trans…¹ monto IVA ## <dbl> <fct> <chr> <chr> <chr> <chr> <dbl> <dbl> ## 1 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. VENTAS… 3.77e3 0 ## 2 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. COMPRA… 1.94e4 2.32e3 ## 3 2022 Jul MANABI 24 DE MAYO CONSTRUCCIÓN. COMPRA… 1.50e3 0 ## 4 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… VENTAS… 8.04e3 9.64e2 ## 5 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… VENTAS… 5.61e7 0 ## 6 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… EXPORT… 4.60e7 0 ## 7 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… COMPRA… 4.34e7 5.20e6 ## 8 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… COMPRA… 8.83e7 0 ## 9 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… IMPORT… 6.62e6 0 ## 10 2022 Abr EL ORO MACHALA COMERCIO AL POR MAYOR… COMPRA… 6.88e5 0 ## # … with 127,434 more rows, and abbreviated variable name ¹transaccion ``` --- ## 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()`. ### Total de Compras y Ventas con tarifa 0% ```r ventas %>% summarise("Total de Ventas" = sum(VN_tar0), "Total de Compras" = sum(CN_tar0)) ## Total de Ventas Total de Compras ## 1 52718117441 40379967076 ``` Podemos empezar a combinar varias funciones. ### Total de Compras y Ventas con tarifa 0% de Enero ```r ventas %>% filter(mes=="Ene") %>% summarise("Total de Ventas" = sum(VN_tar0), "Total de Compras" = sum(CN_tar0)) ## Total de Ventas Total de Compras ## 1 5140963213 3989730974 ``` --- ## 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. ### Compras y Ventas promedio mensuales con tarifa 0% ```r ventas %>% group_by(mes) %>% summarise("Ventas Promedio" = mean(VN_tar0), "Compras Promedio" = mean(CN_tar0)) ## # A tibble: 9 × 3 ## mes `Ventas Promedio` `Compras Promedio` ## <fct> <dbl> <dbl> ## 1 Ene 1262826. 980037. ## 2 Feb 1240205. 982679. ## 3 Mar 1377670. 1087916. ## 4 Abr 1352122. 1067867. ## 5 May 1392189. 1131353. ## 6 Jun 2183627. 1393465. ## 7 Jul 1385416. 1119407. ## 8 Ago 1438571. 1123532. ## 9 Sep 1414848. 1122615. ``` --- ## Agrupar o segmentar datos ### Compras y Ventas promedio mensuales con tarifa 0% de las provincias de Pichincha y Guayas ```r ventas %>% filter(provincia==c("PICHINCHA", "GUAYAS")) %>% group_by(mes, provincia) %>% summarise("Ventas Promedio" = mean(VN_tar0), "Compras Promedio" = mean(CN_tar0)) ## `summarise()` has grouped output by 'mes'. You can override using the `.groups` ## argument. ## # A tibble: 18 × 4 ## # Groups: mes [9] ## mes provincia `Ventas Promedio` `Compras Promedio` ## <fct> <chr> <dbl> <dbl> ## 1 Ene GUAYAS 6834387. 5381795. ## 2 Ene PICHINCHA 10422218. 6926765. ## 3 Feb GUAYAS 6316326. 5527043. ## 4 Feb PICHINCHA 7198278. 5025188. ## 5 Mar GUAYAS 6346642. 6743823. ## 6 Mar PICHINCHA 9361868. 6695618. ## 7 Abr GUAYAS 2877375. 2890446. ## 8 Abr PICHINCHA 11063782. 7836169. ## 9 May GUAYAS 4267125. 3436021. ## 10 May PICHINCHA 5908308. 5497123. ## 11 Jun GUAYAS 6894178. 5755348. ## 12 Jun PICHINCHA 11447665. 7069607. ## 13 Jul GUAYAS 2396788. 1649057. ## 14 Jul PICHINCHA 7679194. 6002600. ## 15 Ago GUAYAS 5160333. 4134635. ## 16 Ago PICHINCHA 13167258. 8582414. ## 17 Sep GUAYAS 4067638. 3422466. ## 18 Sep PICHINCHA 14860987. 10567812. ``` --- class: middle, center, inverse <br> <br> # Importación y Manipulación de Datos en R ## **CAPÍTULO 2** <br> <br> .center[ ### [@MasappEC
](https://www.facebook.com/MasappEC/) ### [@Masappdata
](https://twitter.com/Masappdata) ]