class: center, middle, inverse, title-slide # Clase 1 ## Conceptos básicos ### Equipo FI-UNLZ ### Facultad de Ingeniería ### 2021-07-28 --- layout: true background-image: url(http://www.ingenieria.unlz.edu.ar/ingenieria/wp-content/uploads/2012/08/unlzfi.fw_-e1386353630407.png) background-position: 95% 0% background-size: 10% --- # **Introducción** ##Temas a tratar hoy: -- <br> - IDE RStudio. Paquetes y Estructuras y tipos de Datos. Seteo de directorio y creación de proyectos. Estructuras de programación. -- - Manipulación de datos: Importar, organizar, estructurar, analizar. Visualización gráfica básica. <center> <img src="https://media1.tenor.com/images/110b723231786c357656e00c5a074e24/tenor.gif" alt="drawing" width="250"/><center> --- class: inverse, center, middle, animated, wobble # RStudio: Aliado de la investigación --- # **Investigación Reproducible** ## ¿Porqué? La investigación científica debe disponer de dispositivos que aseguren la reproducibilidad de sus resultados y afirmaciones. <br> Esto muy pronto será un requisito para la publicación de artículos. <br> Los datos y resultados deben ser: Localizables, Accesibles, Interoperables y Reutilizables <br> RStudio es una herramienta muy valiosa en este aspecto y será un aliado en cualquier auditoría. <center> <img src="http://clasesvirtuales.org/mafalda_lupa.jpg" alt="drawing" width="250"/><center> --- # **Investigación Reproducible** ### Herramientas: #### Rproject: Los proyectos creados en R permiten incluir en una sóla carpeta los datos, los elementos visuales agregados (figuras, etc.), y los informes finales creados en el formato deseado. #### Rmarkdown: Es el archivo base que conectará toda la información, el código, los datos y el texto plano para generar un informe/presentación/archivo en el formato deseado. <center> <img src="http://www.clasesvirtuales.org/fs_files/user_img/Rmark.png" alt="drawing" width="150"/><center> --- # **Investigación Reproducible** ### Sintaxis Markdown en R: [Acceder a la Guía](http://www.clasesvirtuales.org/fs_files/user_img/Guia_completa_markdown_y_su_integracion_con_R.pdf) <embed src="http://www.clasesvirtuales.org/fs_files/user_img/IMAGEN_GUIA_RMARKDOWN.JPG" width="100%" height="250px" /> ### Publicación y DOI: Los productos de nuestro trabajo pueden compartirse en plataformas como Github y nuestra autoría puede asegurarse mediante un DOI. --- class: inverse, center, middle, animated, swing # Estructuras básicas de datos --- # **Introducción** ##Análisis y Manipulación de Datos en R: ¿Cómo empezar? -- - Si nunca antes usaste R, puedes comenzar un curso básico instalando la librería (swirl). <center> <img src="http://www.clasesvirtuales.org/fs_files/user_img/swirl.png" alt="drawing" width="500"/><center> --- # **Organización de los Datos de R** ## Estructuras básicas <div style="float: left; width: 40%;"> <br> - Vector: Es un conjunto lineal de datos del mismo tipo. <br> <br> - Matrix: Es una tabla con elementos del mismo tipo. <br> <br> - Data Frame: Una tabla donde cada columna puede tener datos de distinto tipo. <br> <br> - List: Puede contener datos, estructuras.... </div> <div style="float: right; width: 60%;"> <img src="http://www.clasesvirtuales.org/fs_files/user_img/Data.png" alt="drawing" width="500"/> </div> --- # **Ejemplos** ##Vector Secuencia lineal de datos. Para identificar una parte del vector se utiliza [ ] ```r b <- c(1, "2", 3, 4) b ``` ``` ## [1] "1" "2" "3" "4" ``` ```r class(b) ``` ``` ## [1] "character" ``` ```r data(uspop) uspop[4] ``` ``` ## [1] 9.64 ``` ```r uspop[2:10] ``` ``` ## [1] 5.31 7.24 9.64 12.90 17.10 23.20 31.40 39.80 50.20 ``` ```r uspop[c(3, 5, 8)] ``` ``` ## [1] 7.24 12.90 31.40 ``` --- # **Ejemplos** ##Matrix Es un arreglo bidimensional. Una forma de crear una matriz es generando un vector y aplicándole la función matrix(). Por defecto R y S-PLUS llenan la matriz con los valores del vector por columna, primero la primera columna, luego la segunda, etc . Para llenar una matriz por fila hay que utilizar el argumento "byrow=T" ```r v <- 1:8 a <- matrix(v, 2, 4) a ``` ``` ## [,1] [,2] [,3] [,4] ## [1,] 1 3 5 7 ## [2,] 2 4 6 8 ``` ```r b <- matrix(v, 2, 4, byrow = T) b ``` ``` ## [,1] [,2] [,3] [,4] ## [1,] 1 2 3 4 ## [2,] 5 6 7 8 ``` --- # **Ejemplos** ##Matrices obtenidas con cbind rbind. ```r col1 <- c(1, 2, 3) col2 <- c(4, 5, 6) col3 <- c(0, 0, 0) A <- cbind(col1, col2, col3) #pegamos los vectores en columnas A ``` ``` ## col1 col2 col3 ## [1,] 1 4 0 ## [2,] 2 5 0 ## [3,] 3 6 0 ``` ```r B <- rbind(col1, col2, col3) #pegamos los vectores en filas B ``` ``` ## [,1] [,2] [,3] ## col1 1 2 3 ## col2 4 5 6 ## col3 0 0 0 ``` --- # **Ejemplos** ##Data Frame Cada columna es un vector y puede contener un tipo de datos (Numérico, lógico, etc). Para ejemplificarlos veremos algunos datasets típicos de R (iris, mtcars, HairEyeColor, etc.). <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Sepal.Length </th> <th style="text-align:right;"> Sepal.Width </th> <th style="text-align:right;"> Petal.Length </th> <th style="text-align:right;"> Petal.Width </th> <th style="text-align:left;"> Species </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 5.1 </td> <td style="text-align:right;"> 3.5 </td> <td style="text-align:right;"> 1.4 </td> <td style="text-align:right;"> 0.2 </td> <td style="text-align:left;"> setosa </td> </tr> <tr> <td style="text-align:right;"> 4.9 </td> <td style="text-align:right;"> 3.0 </td> <td style="text-align:right;"> 1.4 </td> <td style="text-align:right;"> 0.2 </td> <td style="text-align:left;"> setosa </td> </tr> <tr> <td style="text-align:right;"> 4.7 </td> <td style="text-align:right;"> 3.2 </td> <td style="text-align:right;"> 1.3 </td> <td style="text-align:right;"> 0.2 </td> <td style="text-align:left;"> setosa </td> </tr> </tbody> </table> ### Prueba en tu consola: iris[1,,] <br> iris[1:4,c(1,3)] <br> iris["Sepal.Length"] <br> iris$Sepal.Length --- # **Familia de funciones "Apply"** - Se basan en acciones a aplicar a filas o columnas de una estructura. - Para más detalle ver: [R para principiantes](https://bookdown.org/jboscomendoza/r-principiantes4/la-familia-apply.html) - Ejemplo `apply(Estructura, MARGIN, FUN)` ```r data1 <- data.frame(var1 = c(1:4), var2 = c(6:9)) MediasFilas <- apply(data1, 1, mean) SumasColumnas <- apply(data1, 2, sum) ``` <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <caption>Datos del Data Frame</caption> <thead> <tr> <th style="text-align:center;"> var1 </th> <th style="text-align:center;"> var2 </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 6 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 7 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> 8 </td> </tr> <tr> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> 9 </td> </tr> </tbody> </table> </div> <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <caption>Medias Filas</caption> <thead> <tr> <th style="text-align:center;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 3.5 </td> </tr> <tr> <td style="text-align:center;"> 4.5 </td> </tr> <tr> <td style="text-align:center;"> 5.5 </td> </tr> <tr> <td style="text-align:center;"> 6.5 </td> </tr> </tbody> </table> </div> <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <caption>Sumas Columnas</caption> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:center;"> x </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> var1 </td> <td style="text-align:center;"> 10 </td> </tr> <tr> <td style="text-align:left;"> var2 </td> <td style="text-align:center;"> 30 </td> </tr> </tbody> </table> </div> --- # **Ejemplos** ##Lista e iteración "for" Supongamos que queremos formar un archivo que contenga todos los incluidos en archivos del mismo tipo de un directorio. ("Una base de datos común"). <br> Partiendo de los archivos "uno" ``` ## var1 var2 ## 1 hola hola ## 2 xx xx ## 3 yy yy ``` y "dos" ``` ## var1 var2 ## 1 chau hasta ## 2 12 siempre ``` --- # **Ejemplos** _Lista e iteración "for"_ ###Obtendremos una base común total. <div style="float: left; width: 60%;"> ```r library(data.table) ## PathProject Pathproject = "./lista_archivos" ## files Namefiles = list.files(Pathproject, full.names = TRUE) Namefiles ## unión de archivos descargados tmp <- list() for (i in 1:length(Namefiles)) { tmp[[i]] <- fread(Namefiles[i]) } basetotal <- rbindlist(tmp) basetotal ``` </div> <div style="float: right; width: 30%;"> ###_Datos concatenados:_ <br> ``` ## var1 var2 ## 1: hola hola ## 2: xx xx ## 3: yy yy ## 4: chau hasta ## 5: 12 siempre ``` --- class: inverse, center, middle, animated, slideInRight # Tratamiento de datos ordenados --- ##Estructura de datos (ordenados vs. desordenados) - Con el paquete *tidyr* (que es parte de *tidyverse*) se utilizan las sentencias *pivot_longer* y *pivot_wider* para organizar los datos. <img src="http://www.clasesvirtuales.org/fs_files/user_img/tidy.png" alt="drawing" width="800"/> <br> <center><center> --- ##Ejemplo en dataset de R <div style="float: left; width: 40%;"> <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:right;"> Brown </th> <th style="text-align:right;"> Blue </th> <th style="text-align:right;"> Hazel </th> <th style="text-align:right;"> Green </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:right;"> 32 </td> <td style="text-align:right;"> 11 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:right;"> 53 </td> <td style="text-align:right;"> 50 </td> <td style="text-align:right;"> 25 </td> <td style="text-align:right;"> 15 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 30 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 8 </td> </tr> </tbody> </table> </div> <div style="float: left; width: 60%;"> - Leyendo como data frame (los datos se "ordenan") <br> <div style="border: 1px solid #ddd; padding: 5px; "><table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Hair </th> <th style="text-align:left;"> Eye </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Freq </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 32 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 53 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 11 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 50 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 30 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 25 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 15 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 8 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 66 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 16 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 9 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 34 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 64 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 29 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 14 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 8 </td> </tr> </tbody> </table></div> </div> --- class: inverse, center, middle, animated, bounceInDown # Usando dplyr ([tidyverse](https://www.tidyverse.org/)) --- ## Funciones más importantes: - *arrange* ordena los datos según un criterio <br> ```r H <- as.data.frame(HairEyeColor) A <- arrange(H, by_group = Freq) ``` <div style="border: 1px solid #ddd; padding: 5px; "><table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Hair </th> <th style="text-align:left;"> Eye </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Freq </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 4 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 8 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 8 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 9 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 11 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 14 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 15 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 16 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 25 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 29 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 30 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 32 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 34 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 36 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 50 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 53 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 64 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 66 </td> </tr> </tbody> </table></div> --- ## Funciones más importantes: - *summarize* resume información sobre una variable ```r library(tidyverse) Petalong <- summarize(iris, Mean.Petal.Length = mean(Petal.Length), SD.Petal.Length = sd(Petal.Length)) ``` <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Mean.Petal.Length </th> <th style="text-align:right;"> SD.Petal.Length </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 3.758 </td> <td style="text-align:right;"> 1.765298 </td> </tr> </tbody> </table> <br> *Recordemos otras escrituras: mean(iris$Petal.Length)....* --- ## Funciones más importantes: - *group_by* agrupa información según una variable para luego realizar alguna acción o cálculo. ```r Summary.Petal <- group_by(iris, Species) Summary.Petal <- summarize(Summary.Petal, Mean.Petal.Length = mean(Petal.Length), SD.Petal.Length = sd(Petal.Length)) ``` <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:right;"> Mean.Petal.Length </th> <th style="text-align:right;"> SD.Petal.Length </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> setosa </td> <td style="text-align:right;"> 1.462 </td> <td style="text-align:right;"> 0.1736640 </td> </tr> <tr> <td style="text-align:left;"> versicolor </td> <td style="text-align:right;"> 4.260 </td> <td style="text-align:right;"> 0.4699110 </td> </tr> <tr> <td style="text-align:left;"> virginica </td> <td style="text-align:right;"> 5.552 </td> <td style="text-align:right;"> 0.5518947 </td> </tr> </tbody> </table> --- ## Funciones más importantes: - *mutate* Incorpora nuevas variables (columnas). ```r H <- as.data.frame(HairEyeColor) s <- sum(H$Freq) A <- mutate(H, FreqRel = round(Freq/s, 2)) ``` <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Hair </th> <th style="text-align:left;"> Eye </th> <th style="text-align:left;"> Sex </th> <th style="text-align:right;"> Freq </th> <th style="text-align:right;"> FreqRel </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 32 </td> <td style="text-align:right;"> 0.05 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 53 </td> <td style="text-align:right;"> 0.09 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 11 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 50 </td> <td style="text-align:right;"> 0.08 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 30 </td> <td style="text-align:right;"> 0.05 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 25 </td> <td style="text-align:right;"> 0.04 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 15 </td> <td style="text-align:right;"> 0.03 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Male </td> <td style="text-align:right;"> 8 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 36 </td> <td style="text-align:right;"> 0.06 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 66 </td> <td style="text-align:right;"> 0.11 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 16 </td> <td style="text-align:right;"> 0.03 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 9 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 34 </td> <td style="text-align:right;"> 0.06 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Blue </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 64 </td> <td style="text-align:right;"> 0.11 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 29 </td> <td style="text-align:right;"> 0.05 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Hazel </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Black </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 0.00 </td> </tr> <tr> <td style="text-align:left;"> Brown </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 14 </td> <td style="text-align:right;"> 0.02 </td> </tr> <tr> <td style="text-align:left;"> Red </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 0.01 </td> </tr> <tr> <td style="text-align:left;"> Blond </td> <td style="text-align:left;"> Green </td> <td style="text-align:left;"> Female </td> <td style="text-align:right;"> 8 </td> <td style="text-align:right;"> 0.01 </td> </tr> </tbody> </table> --- class: inverse, center, middle, animated, bounceInDown # ¿Seguimos? <br> <center> <img src="http://www.clasesvirtuales.org/fs_files/user_img/mafalda-despertar.jpg" alt="drawing" width="35%"/><center> <br> --- ## Funciones más importantes: - *filter* Selecciona datos según una o varias variables (columnas). <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> simbolo </th> <th style="text-align:left;"> representa </th> <th style="text-align:left;"> simbolos </th> <th style="text-align:left;"> representan </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> > </td> <td style="text-align:left;"> Mayor que </td> <td style="text-align:left;"> != </td> <td style="text-align:left;"> distinto a </td> </tr> <tr> <td style="text-align:left;"> < </td> <td style="text-align:left;"> Menor que </td> <td style="text-align:left;"> %in% </td> <td style="text-align:left;"> dentro del grupo </td> </tr> <tr> <td style="text-align:left;"> == </td> <td style="text-align:left;"> Igual a </td> <td style="text-align:left;"> is.na </td> <td style="text-align:left;"> es NA </td> </tr> <tr> <td style="text-align:left;"> >= </td> <td style="text-align:left;"> mayor o igual a </td> <td style="text-align:left;"> !is.na </td> <td style="text-align:left;"> no es NA </td> </tr> <tr> <td style="text-align:left;"> <= </td> <td style="text-align:left;"> menor o igual a </td> <td style="text-align:left;"> | & </td> <td style="text-align:left;"> o, y </td> </tr> </tbody> </table> --- ## Ejemplo: *¿Qué se obtendrá como salida de las siguientes sentencias?* ```r data("iris") Filtrado <- filter(iris, Species != "setosa") Agrupo <- group_by(Filtrado, Species) Resumo <- summarise_all(Agrupo, mean) ``` -- <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:right;"> Sepal.Length </th> <th style="text-align:right;"> Sepal.Width </th> <th style="text-align:right;"> Petal.Length </th> <th style="text-align:right;"> Petal.Width </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> versicolor </td> <td style="text-align:right;"> 5.936 </td> <td style="text-align:right;"> 2.770 </td> <td style="text-align:right;"> 4.260 </td> <td style="text-align:right;"> 1.326 </td> </tr> <tr> <td style="text-align:left;"> virginica </td> <td style="text-align:right;"> 6.588 </td> <td style="text-align:right;"> 2.974 </td> <td style="text-align:right;"> 5.552 </td> <td style="text-align:right;"> 2.026 </td> </tr> </tbody> </table> --- ## Funciones más importantes: - *select* Selecciona variables dentro de la estructura ó las elimina (-) - Utiliza los indicadores *starts_with* - *ends_with* o *contains* (y por ello se diferencia de la selección con indicación de ubicación de la columna). <div style="float: left; width: 60%;"> iris1<-select(iris, contains("Petal")) <br> iris1<-summarize_all(iris1, mean) <br> -------------- <br> iris2<-select(iris, -contains("Petal")) <br> iris2<-summarize_all(iris2, mean) <br> -------------- <br> iris3<-select(iris, starts_with("Petal") & !ends_with("Width")) <br> iris3<-summarize_all(iris3, mean) <br> </div> <div style="float: right; width: 40%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Petal.Length </th> <th style="text-align:right;"> Petal.Width </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 3.758 </td> <td style="text-align:right;"> 1.199333 </td> </tr> </tbody> </table> <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Sepal.Length </th> <th style="text-align:right;"> Sepal.Width </th> <th style="text-align:right;"> Species </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 5.843333 </td> <td style="text-align:right;"> 3.057333 </td> <td style="text-align:right;"> NA </td> </tr> </tbody> </table> <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> Petal.Length </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 3.758 </td> </tr> </tbody> </table> </div> --- # Funciones más importantes - *Pipeline (%>%)* Realiza las acciones en forma secuencial, ahorra escritura, anidamientos y colocar nombres distintos a cada estructura creada. Sin Pipe ```r Grupo <- group_by(iris, Species) Selectos <- select(Grupo, contains("Petal")) Salida <- summarize_all(Selectos, mean) ``` Con Pipe (Prueben en la consola) ```r iris %>% group_by(Species) %>% select(contains("Petal")) %>% summarize_all(mean) ``` <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Species </th> <th style="text-align:right;"> Petal.Length </th> <th style="text-align:right;"> Petal.Width </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> setosa </td> <td style="text-align:right;"> 1.462 </td> <td style="text-align:right;"> 0.246 </td> </tr> <tr> <td style="text-align:left;"> versicolor </td> <td style="text-align:right;"> 4.260 </td> <td style="text-align:right;"> 1.326 </td> </tr> <tr> <td style="text-align:left;"> virginica </td> <td style="text-align:right;"> 5.552 </td> <td style="text-align:right;"> 2.026 </td> </tr> </tbody> </table> --- # "Join ~ Merge" *Familia "Join"* Es parte del paquete "dplyr". Combina datos de data frames siguiendo la lógica del lenguaje SQL para bases de datos. (Puede también usarse "merge"- "by") + `anti_join` Registros de la primera base que no figuran en la segunda. + `semi_join` Registros de la primera base que también figuran en la segunda. + `full_join` Todos los registros, completa con "NA" + `inner_join` Registros que figuran en ambas bases según un criterio ("by") + `left_join` Todos los registros de la primera base y completa con "NA". + `right_join` Todos los registros de la segunda base y completa con "NA". ```r Insumos <- data.frame(InsumosId = c(1:4), NombreInsumo = c("A", "B", "C", "D")) Insumoscomprados <- data.frame(InsumosId = c(1, 2, 3, 5), Cantidad = c(90, 20, 50, 10)) ``` <div style="float: left; width: 50%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="font-size: 16px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> </tr> <tr> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> D </td> </tr> </tbody> </table> </div> <div style="float: left; width: 50%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="font-size: 16px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> Cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> 90 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> 20 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> 50 </td> </tr> <tr> <td style="text-align:center;"> 5 </td> <td style="text-align:center;"> 10 </td> </tr> </tbody> </table> </div> --- # Finalizando... ##_Anti_, _Semi_, _Full_ ```r Anti <- anti_join(Insumos, Insumoscomprados) Semi <- semi_join(Insumos, Insumoscomprados) Full <- full_join(Insumos, Insumoscomprados) ``` <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> D </td> </tr> </tbody> </table> </div> <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> </tr> </tbody> </table> </div> <div style="float: left; width: 30%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> <th style="text-align:center;"> Cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> <td style="text-align:center;"> 90 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> <td style="text-align:center;"> 20 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> <td style="text-align:center;"> 50 </td> </tr> <tr> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> D </td> <td style="text-align:center;"> NA </td> </tr> <tr> <td style="text-align:center;"> 5 </td> <td style="text-align:center;"> NA </td> <td style="text-align:center;"> 10 </td> </tr> </tbody> </table> </div> --- # Finalizandooo... ##_Inner_, _Left_, _Right_ ```r Inner <- inner_join(Insumos, Insumoscomprados) Left <- left_join(Insumos, Insumoscomprados) Right <- right_join(Insumos, Insumoscomprados) ``` <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> <th style="text-align:center;"> Cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> <td style="text-align:center;"> 90 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> <td style="text-align:center;"> 20 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> <td style="text-align:center;"> 50 </td> </tr> </tbody> </table> <div style="float: left; width: 50%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> <th style="text-align:center;"> Cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> <td style="text-align:center;"> 90 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> <td style="text-align:center;"> 20 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> <td style="text-align:center;"> 50 </td> </tr> <tr> <td style="text-align:center;"> 4 </td> <td style="text-align:center;"> D </td> <td style="text-align:center;"> NA </td> </tr> </tbody> </table> </div> <div style="float: left; width: 50%;"> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> InsumosId </th> <th style="text-align:center;"> NombreInsumo </th> <th style="text-align:center;"> Cantidad </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 1 </td> <td style="text-align:center;"> A </td> <td style="text-align:center;"> 90 </td> </tr> <tr> <td style="text-align:center;"> 2 </td> <td style="text-align:center;"> B </td> <td style="text-align:center;"> 20 </td> </tr> <tr> <td style="text-align:center;"> 3 </td> <td style="text-align:center;"> C </td> <td style="text-align:center;"> 50 </td> </tr> <tr> <td style="text-align:center;"> 5 </td> <td style="text-align:center;"> NA </td> <td style="text-align:center;"> 10 </td> </tr> </tbody> </table> </div> --- class: inverse, center, middle, animated, swing # Todo lindo y apareció Tibble!!!, R es infinito... <center> <img src="https://img.culturacolectiva.com/content/2016/06/1490030.jpg" alt="drawing" width="250"/><center> --- # Tibble - *Tibble* Es un data frame que utiliza Tidyverse automáticamente. - *Tibble* Nunca cambia los inputs, ni el nombre de las variables y tampoco le asigna nombre a las filas, visualiza en forma acotada los datos. No asume los caracteres como factores (¡!). Se puede pasar de un data frame a un tibble: as.tibble(data) y viceversa: as.data.frame(data). -Ejemplo 1: <br> Ingresen en consola >iris <br> Ahora ingresen: >as.tibble(iris) -Ejemplo 2: ```r tibble(ch = c("m", "b", "a", "d"), x = 1:4, y = 1, z = x^2 + y) ``` ``` ## # A tibble: 4 x 4 ## ch x y z ## <chr> <int> <dbl> <dbl> ## 1 m 1 1 2 ## 2 b 2 1 5 ## 3 a 3 1 10 ## 4 d 4 1 17 ``` --- ## Factores En R, los factores se usan para trabajar con variables categóricas, es decir, variables que tienen un conjunto fijo y conocido de valores posibles. También son útiles cuando quieres mostrar vectores de caracteres en un orden no alfabético. Establecidos los niveles, ignora los valores que no aplican (NA) -Ejemplo: ```r x <- c("vie", "lu", "mar", "mie", "lu", "vie", "jue", "marzo") sort(x) ``` ``` ## [1] "jue" "lu" "lu" "mar" "marzo" "mie" "vie" "vie" ``` ```r dias_niveles = c("lu", "mar", "mie", "jue", "vie") x <- factor(x, levels = dias_niveles) sort(x) ``` ``` ## [1] lu lu mar mie jue vie vie ## Levels: lu mar mie jue vie ``` --- class: inverse, center, middle, animated, rubberBand # Trabajando con datos propios <center> <img src="https://recursos.ort.edu.ar/static/archivos/image/1183966/164994.jpg" alt="drawing" width="250"/><center> --- # **Cheatsheets** ## Importar datos Guía Rápida: [Acceder a Guía de Importación de Datos](http://www.clasesvirtuales.org/fs_files/user_img/data-import-Spanish_translation-2019.pdf) <br> <embed src=" http://www.clasesvirtuales.org/fs_files/user_img/IMAGEN_CHEATSHEET_IMPORTAR_DATOS.JPG" width="100%" height="250px" /> --- # Importando datos ## El paquete **_readr_** - Es parte del paquete tidyverse - Lee archivos de texto planos formateados de distinta manera (excel,txt, etc.) + `read_csv()` columnas con , decimal con . + `read_csv2()` columnas con ; decimal con , + `read_delim()` columnas con delimitador personalizado, ej delim = "|" - skip = n saltea n lineas antes de empezar a leer - n_max = n solo lee n filas - col_names = FALSE le pone nombres de columna genericos a las filas - na = "." si donde no tenemos datos hay un . rellena el valor con NA - skip_empty_rows= TRUE saltea lineas sin datos - archivos terminados en .gz, .bz2, .xz, or .zip son descomprimidos automaticamente. - archivos http://, https://, ftp://, o ftps:// se descargan automaticamente. - Para leer archivos excel u ODS hay que agregar otros paquetes: + `library(readxl)`: read_excel(), read_xls() , read_xlsx() + `library(readODS)`: read_ods --- # Importamos - Ejemplo 1 ```r vinos <- read_csv("https://raw.githubusercontent.com/cienciadedatos/datos-de-miercoles/master/datos/2019/2019-06-12/vinos.csv") vinos[1:2, ] ``` ``` ## # A tibble: 2 x 10 ## pais nombre puntos precio provincia region_1 region_2 variedad vina ## <chr> <chr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr> ## 1 Italia Vulkà B~ 87 NA Sicily & ~ Etna <NA> Ensamblaj~ Nicosia ## 2 Portu~ Avidagos 87 15 Douro <NA> <NA> Portugues~ Quinta ~ ## # ... with 1 more variable: titulo_resena <chr> ``` _¿Cuántos vinos hay por país en este listado ordenados de mayor a menor?_ `vinos %>% group_by(pais) %>% summarise(total=n())%>%arrange(-total)` <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> pais </th> <th style="text-align:right;"> total </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Estados Unidos </td> <td style="text-align:right;"> 54504 </td> </tr> <tr> <td style="text-align:left;"> Francia </td> <td style="text-align:right;"> 22093 </td> </tr> <tr> <td style="text-align:left;"> Italia </td> <td style="text-align:right;"> 19540 </td> </tr> <tr> <td style="text-align:left;"> España </td> <td style="text-align:right;"> 6645 </td> </tr> <tr> <td style="text-align:left;"> Portugal </td> <td style="text-align:right;"> 5691 </td> </tr> <tr> <td style="text-align:left;"> Chile </td> <td style="text-align:right;"> 4472 </td> </tr> <tr> <td style="text-align:left;"> Argentina </td> <td style="text-align:right;"> 3800 </td> </tr> <tr> <td style="text-align:left;"> Austria </td> <td style="text-align:right;"> 3345 </td> </tr> <tr> <td style="text-align:left;"> Australia </td> <td style="text-align:right;"> 2329 </td> </tr> <tr> <td style="text-align:left;"> Alemania </td> <td style="text-align:right;"> 2165 </td> </tr> <tr> <td style="text-align:left;"> Nueva Zelanda </td> <td style="text-align:right;"> 1419 </td> </tr> <tr> <td style="text-align:left;"> Sudáfrica </td> <td style="text-align:right;"> 1401 </td> </tr> <tr> <td style="text-align:left;"> Israel </td> <td style="text-align:right;"> 505 </td> </tr> <tr> <td style="text-align:left;"> Grecia </td> <td style="text-align:right;"> 466 </td> </tr> <tr> <td style="text-align:left;"> Canadá </td> <td style="text-align:right;"> 257 </td> </tr> <tr> <td style="text-align:left;"> Hungría </td> <td style="text-align:right;"> 146 </td> </tr> <tr> <td style="text-align:left;"> Bulgaria </td> <td style="text-align:right;"> 141 </td> </tr> <tr> <td style="text-align:left;"> Rumania </td> <td style="text-align:right;"> 120 </td> </tr> <tr> <td style="text-align:left;"> Uruguay </td> <td style="text-align:right;"> 109 </td> </tr> <tr> <td style="text-align:left;"> Turquía </td> <td style="text-align:right;"> 90 </td> </tr> <tr> <td style="text-align:left;"> Eslovenia </td> <td style="text-align:right;"> 87 </td> </tr> <tr> <td style="text-align:left;"> Georgia </td> <td style="text-align:right;"> 86 </td> </tr> <tr> <td style="text-align:left;"> Inglaterra </td> <td style="text-align:right;"> 74 </td> </tr> <tr> <td style="text-align:left;"> Croacia </td> <td style="text-align:right;"> 73 </td> </tr> <tr> <td style="text-align:left;"> México </td> <td style="text-align:right;"> 70 </td> </tr> <tr> <td style="text-align:left;"> NA </td> <td style="text-align:right;"> 63 </td> </tr> <tr> <td style="text-align:left;"> Moldavia </td> <td style="text-align:right;"> 59 </td> </tr> <tr> <td style="text-align:left;"> Brazil </td> <td style="text-align:right;"> 52 </td> </tr> <tr> <td style="text-align:left;"> Líbano </td> <td style="text-align:right;"> 35 </td> </tr> <tr> <td style="text-align:left;"> Marruecos </td> <td style="text-align:right;"> 28 </td> </tr> <tr> <td style="text-align:left;"> Perú </td> <td style="text-align:right;"> 16 </td> </tr> <tr> <td style="text-align:left;"> Ucrania </td> <td style="text-align:right;"> 14 </td> </tr> <tr> <td style="text-align:left;"> Macedonia </td> <td style="text-align:right;"> 12 </td> </tr> <tr> <td style="text-align:left;"> República Checa </td> <td style="text-align:right;"> 12 </td> </tr> <tr> <td style="text-align:left;"> Serbia </td> <td style="text-align:right;"> 12 </td> </tr> <tr> <td style="text-align:left;"> Chipre </td> <td style="text-align:right;"> 11 </td> </tr> <tr> <td style="text-align:left;"> India </td> <td style="text-align:right;"> 9 </td> </tr> <tr> <td style="text-align:left;"> Suiza </td> <td style="text-align:right;"> 7 </td> </tr> <tr> <td style="text-align:left;"> Luxemburgo </td> <td style="text-align:right;"> 6 </td> </tr> <tr> <td style="text-align:left;"> Armenia </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:left;"> Bosnia y Herzegovina </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:left;"> China </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> Egipto </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> Eslovaquia </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> --- # Importamos - Ejemplos 2 y 3 ```r T3 <- read_delim("Terremotos3.txt", delim = "|") T3[1:2, ] ``` ``` ## # A tibble: 2 x 7 ## time latitude longitude depth mag magType id ## <dttm> <dbl> <dbl> <dbl> <dbl> <chr> <chr> ## 1 2020-06-14 21:23:20 49.2 158. 10 5.4 mww us6000abte ## 2 2020-06-14 21:22:17 17.9 -66.9 13 3.09 md pr2020166020 ``` ```r parti <- read_delim("https://raw.githubusercontent.com/cienciadedatos/datos-de-miercoles/master/datos/2019/2019-04-10/partidos.txt", delim = "\t") parti[1:2, ] ``` ``` ## # A tibble: 2 x 10 ## anio anfitrion estadio ciudad partido_orden fecha equipo_1 equipo_2 ## <dbl> <chr> <chr> <chr> <chr> <date> <chr> <chr> ## 1 1930 Uruguay Estadio P~ Montev~ (1) 1930-07-13 Francia Mexico ## 2 1930 Uruguay Estadio P~ Montev~ (2) 1930-07-13 Estados ~ Bélgica ## # ... with 2 more variables: equipo_1_final <dbl>, equipo_2_final <dbl> ``` --- # Importamos y ordenamos <div style="float: left; width: 60%;"> <br> censo1<-read_delim("censo1.txt", delim = " ") <br> <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Provincia </th> <th style="text-align:right;"> Censo_1991 </th> <th style="text-align:right;"> Censo_2001 </th> <th style="text-align:right;"> Censo_2010 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> BAires </td> <td style="text-align:right;"> 10934727 </td> <td style="text-align:right;"> 11460575 </td> <td style="text-align:right;"> 13596320 </td> </tr> <tr> <td style="text-align:left;"> Cordoba </td> <td style="text-align:right;"> 1208554 </td> <td style="text-align:right;"> 1368301 </td> <td style="text-align:right;"> 1466823 </td> </tr> <tr> <td style="text-align:left;"> Rosario </td> <td style="text-align:right;"> 1118905 </td> <td style="text-align:right;"> 1161188 </td> <td style="text-align:right;"> 1236089 </td> </tr> </tbody> </table> <br> <br> <br> Para realizar el camino inverso se utiliza `spread()` <br> censo3<-spread(data = censo2, key = "censo", value = "poblacion") </div> <div style="float: left; width: 40%;"> <br/> ORDENANDO: <br> censo1<-read_delim("censo1.txt", delim = " ") <br> censo2<-gather(data = censo1, key = "censo", value = "poblacion", 2:4) <br> <table class="table table-striped table-hover table-condensed table-responsive" style="width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Provincia </th> <th style="text-align:left;"> censo </th> <th style="text-align:right;"> poblacion </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> BAires </td> <td style="text-align:left;"> Censo_1991 </td> <td style="text-align:right;"> 10934727 </td> </tr> <tr> <td style="text-align:left;"> Cordoba </td> <td style="text-align:left;"> Censo_1991 </td> <td style="text-align:right;"> 1208554 </td> </tr> <tr> <td style="text-align:left;"> Rosario </td> <td style="text-align:left;"> Censo_1991 </td> <td style="text-align:right;"> 1118905 </td> </tr> <tr> <td style="text-align:left;"> BAires </td> <td style="text-align:left;"> Censo_2001 </td> <td style="text-align:right;"> 11460575 </td> </tr> <tr> <td style="text-align:left;"> Cordoba </td> <td style="text-align:left;"> Censo_2001 </td> <td style="text-align:right;"> 1368301 </td> </tr> <tr> <td style="text-align:left;"> Rosario </td> <td style="text-align:left;"> Censo_2001 </td> <td style="text-align:right;"> 1161188 </td> </tr> <tr> <td style="text-align:left;"> BAires </td> <td style="text-align:left;"> Censo_2010 </td> <td style="text-align:right;"> 13596320 </td> </tr> <tr> <td style="text-align:left;"> Cordoba </td> <td style="text-align:left;"> Censo_2010 </td> <td style="text-align:right;"> 1466823 </td> </tr> <tr> <td style="text-align:left;"> Rosario </td> <td style="text-align:left;"> Censo_2010 </td> <td style="text-align:right;"> 1236089 </td> </tr> </tbody> </table> </div> --- # Guardamos tablas - Para guardar tablas en archivos de texto plano se cambia _read_ por _write_: + `write_csv()` + `write_csv2()` + `write_delim()` ```r write_delim(censo2, "cen.txt", delim = "/", append = FALSE) ``` <center><embed src="http://clasesvirtuales.org/cen.txt"><center> --- class: inverse, center, middle, animated, rubberBand # Adelantando.. <center> <img src="https://media1.tenor.com/images/110b723231786c357656e00c5a074e24/tenor.gif" alt="drawing" width="250"/><center> --- # Gráficos - Ahora que sabemos manejar la información hay que crear visualizaciones. - Paquetes: `ggplot2`, `highcharter`, etc. <center><embed src="http://rstudio.clasesvirtuales.org:3838/sample-apps/Grafico_clase_1.html" width="100%" height="450px"><center> --- # TAREAS - Utilizar datos de R o propios para practicar el manejo de estructuras visto. - Ver: if-else, while, break y next. [R para principiantes](https://bookdown.org/jboscomendoza/r-principiantes4/estructuras-de-control.html) - Crear un archivo Rmarkdown y explorar opciones. - Sitios para dar una mirada: + [RStudio - Pie de página:Learning](https://rstudio.com/) + [Materiales y ayudas realizados por usuarios](https://rpubs.com/) + [Galería de aplicativos interactivos](https://shiny.rstudio.com/gallery/) - Documentos: + [Libro Ciencia de Datos](https://es.r4ds.hadley.nz/) + [Documentación oficial](https://cran.r-project.org/doc/) + [Manual para principiantes](https://cran.r-project.org/doc/contrib/rdebuts_es.pdf) <center> <img src="https://altalingua.es/wp-content/uploads/2014/07/mafalda.jpg" alt="drawing" width="250"/><center> --- class: inverse, center, middle, animated, swing # Hasta el próximo encuentro!!!! <br> # Equipo FI-UNLZ