class: center, middle .linea-superior[] .linea-inferior[] <img src="imagenes/logo_portada2.png" width="200" /> ## INE Educa: Clases abiertas de R ## Proyecto Ciencia de Datos ## Herramientas de edición de datos I --- name: diapo-basica background-image: url("imagenes/fondo2.PNG") background-size: contain; background-position: 100% 0% # Edición de datos I --- template: diapo-basica Ya sabemos filtrar tablas para quedarnos con lo que necesitamos. -- El siguiente paso es modificar columnas existentes o agregarle nuevas columnas en base a información existente o externa. -- Para eso tenemos la función `mutate`. .center[ <img src="imagenes/dplyverse.png" width="600" />] -- Su sintaxis es la siguiente: -- ```r mutate(data.frame, nombre_columna1 = expresion1, nombre_columna2 = expresion2, ...) ``` --- template: diapo-basica ## Mutate: crear columna nueva Para ilustrar la creación de columnas, creemos un dataframe de ejemplo: ```r compras = tibble(cantidad = c('4', '2', '5'), precio = c(200, 300, 400)) compras ``` ``` ## # A tibble: 3 × 2 ## cantidad precio ## <chr> <dbl> ## 1 4 200 ## 2 2 300 ## 3 5 400 ``` -- Queremos crear una columna llamada `valor_total`, que sea la multiplicación de las dos columnas: -- ```r compras_completo = compras %>% mutate(valor_total = cantidad * precio) ``` -- ¿Qué pasó? -- .center[ <img src="imagenes/error1.png" width="300" />] --- template: diapo-basica ## Mutate: ~~crear columna nueva~~ reemplazar columna existente Primero debemos asegurarnos que ambas columnas sean numéricas: ```r class(compras$cantidad) ``` ``` ## [1] "character" ``` ```r class(compras$precio) ``` ``` ## [1] "numeric" ``` -- Transformamos `cantidad` en numérica, para habilitar operaciones de este tipo: ```r compras_numeric = compras %>% mutate(cantidad = as.numeric(cantidad)) ``` -- ```r class(compras_numeric$cantidad) ``` ``` ## [1] "numeric" ``` ```r class(compras_numeric$precio) ``` ``` ## [1] "numeric" ``` --- template: diapo-basica ## Mutate: crear columna nueva Volvemos a nuestro ejemplo original: -- ```r compras_completo = compras_numeric %>% mutate(valor_total = cantidad * precio) ``` -- <table> <thead> <tr> <th style="text-align:right;"> cantidad </th> <th style="text-align:right;"> precio </th> <th style="text-align:right;"> valor_total </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 800 </td> </tr> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 300 </td> <td style="text-align:right;"> 600 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 400 </td> <td style="text-align:right;"> 2000 </td> </tr> </tbody> </table> --- template: diapo-basica ##Mutate ¿Qué otras cosas podemos hacer? -- ```r compras_mas_completo = compras_completo %>% mutate( valor_cte = 10, max_precio = max(precio), min_precio = min(precio), id_fila = row_number(), col_modificada = precio - 100, num_digitos = valor_total %>% as.character %>% stringr::str_length() ) ``` -- <table style='width:30%; font-family: "Arial Narrow", "Source Sans Pro", sans-serif; width: auto !important; margin-left: auto; margin-right: auto;' class=" lightable-classic"> <thead> <tr> <th style="text-align:right;"> cantidad </th> <th style="text-align:right;"> precio </th> <th style="text-align:right;"> valor_total </th> <th style="text-align:right;"> valor_cte </th> <th style="text-align:right;"> max_precio </th> <th style="text-align:right;"> min_precio </th> <th style="text-align:right;"> id_fila </th> <th style="text-align:right;"> col_modificada </th> <th style="text-align:right;"> num_digitos </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 4 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 800 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 400 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 100 </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 300 </td> <td style="text-align:right;"> 600 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 400 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 3 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 400 </td> <td style="text-align:right;"> 2000 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 400 </td> <td style="text-align:right;"> 200 </td> <td style="text-align:right;"> 3 </td> <td style="text-align:right;"> 300 </td> <td style="text-align:right;"> 4 </td> </tr> </tbody> </table> -- En resumen, de alguna forma u otra, podemos realizar cualquier modificación que se nos ocurra a las columnas de la tabla. -- Las opciones son cientos, por lo que la recomendación es: "Ante la duda, googlear" --- template: diapo-basica ## Mutate: anexo Funciones clásicas para transformación de columnas: - `as.numeric` pasa variable a formato numérico. Filas deben contener solo números para que pueda utilizarse. - `as.character` pasa variable a formato texto. - `as.factor` pasa variable a formato factor, práctico en gráficos y eficiente en términos de memoria. - `as.Date` pasa variable a formato fecha. Filas deben cumplir con formato específico para que puedan ser interpretadas como fechas. - `toupper` / `tolower`: pasa columna string a mayúsculas/minúsculas, respectivamente. - `replace_NA`: reemplaza valores nulos (NA) con el valor especificado. - `round`: redonea columna numérica según la precisión que se ingrese. Por defecto, deja en valor entero un número decimal. - `sum/mean/max/min/sd/median`: Obtiene la suma, media, máximo, mínimo, desviación estándar y mediana, respectivamente, de la columna numérica especificada. - `paste`: concatena los valores de dos columnas string, separadas por un espacio. --- class: center, middle .linea-superior[] .linea-inferior[] <img src="imagenes/logo_portada2.png" width="200" /> ## INE Educa: Clases abiertas de R ## Proyecto Ciencia de Datos ## Herramientas de edición de datos I