Los dos ejercicios presentados a continuación tienen que ver con destrezas aprendidas en clase tanto para el manejo de datos faltantes como para la limpieza de datos.
En el primer ejercicio se nos presenta una tabla de Ingresos y Gastos junto a sus respectivos meses que creamos en RStudio utilizando un data frame, en apoyo de dos librerías fundamentales como tidyverse y dyplr.
library(tidyverse)
library(dplyr)
datos <- data.frame(
Mes = c("Mayo", "Junio", "Julio"),
Ingresos = c(45000, 41500, 51200),
Gastos = c(33400, 35400, 35600)
)
Una vez visualizado esta tabla de Ingresos y Gastos, añadimos otra variable en la que se refleje de total de Impuestos pagados durante cada mes. Además, logramos añadir la informacion de Ingresos, Gastos e Impuestos para el mes de Agosto. Esta nueva columna la creamos con ayuda de pipelines y las funciones add-column() y add_row().
datos <- datos %>%
add_column(Impuestos = c(6450, 6300, 7100)) %>%
add_row(Mes = "Agosto", Ingresos = 49700, Gastos = 36300, Impuestos = 6850)
Una vez hecho esto, quisimos corregir manualmente el ingreso del mes de Julio. Para ello, utilizamos corchetes, los cuáles sirven para elegir vectores de un dataframe. Los corcchetes escogen los vectores por sistema de filas y columnas, por lo que corregimos el dato de la tercera fila y la segunda columna de nuestros datos, donde se encontraba el ingreso del mes de Julio.
datos[3, 2] <- 50400
Luego, creamos una quinta columna en la que pudieramos ver el beneficio total del mes con ayuda de la funcion mutate().
datos <- datos %>%
mutate(Beneficios = Ingresos - Gastos - Impuestos)
Después, agregamos una nueva columna de Balance. Queríamos utilizar esta variable categoríca para identificar en cuál de los meses tuvimos un balance positivo y en cuáles un balance negativo. Para esto, creamos una nueva columna y utilizamos la funcion ifelse(). Esta funcion aplica una condición y te devuelve un valor especifico si la condicíón se cumple y otro si no se cumple. Nosotros pusimos la condición de que la vaeiable Beneficios fuera mayor que 0. Si se cumplia la condición, sería positiva y si no, negativa.
Además, en ese mismo código añadimos la funcion factor() para que la columna fuera creada como tipo factor y crear los niveles positivo y negativo.
datos <- datos %>%
mutate(Balance = factor(ifelse(Beneficios > 0,
"positivo",
"negativo"), levels = c("negativo", "positivo")))
Por último, utilizamos la funcion filter() para quedarnos solamente con los meses donde el Beneficio es positivo.
datos <- datos %>%
filter(Beneficios > 0)
Para este segundo ejercicio utilizamos la base de datos Medicos.csv, la cual tiene información de una muestra de pacientes junto a su nombre, edad, sexo, peso, altura y el nivel de colésterol.
Para este ejercicio comenzamos descargando librerías y creando el data frame. Luego seguimos a revisar los datos, para esto encontramos una visión general de toda la base de datos:
library(tidyverse)
library(visdat)
Medicos.df <- read.csv("Medicos.csv")
skimr::skim(Medicos.df)
| Name | Medicos.df |
| Number of rows | 14 |
| Number of columns | 6 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 4 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| nombre | 0 | 1 | 14 | 31 | 0 | 14 | 0 |
| sexo | 0 | 1 | 1 | 1 | 0 | 2 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| edad | 0 | 1.00 | 38.21 | 15.62 | 18.00 | 24.75 | 35.00 | 49.75 | 68.00 | ▇▅▃▅▂ |
| peso | 1 | 0.93 | 70.92 | 16.13 | 51.00 | 61.00 | 65.00 | 78.00 | 109.00 | ▇▅▅▂▂ |
| altura | 0 | 1.00 | 1.77 | 0.12 | 1.58 | 1.70 | 1.75 | 1.84 | 1.98 | ▆▇▆▃▃ |
| colesterol | 1 | 0.93 | 220.23 | 39.85 | 148.00 | 194.00 | 210.00 | 249.00 | 280.00 | ▂▇▂▅▅ |
Antes de continuar con el ejercicio, decidimos observar los datos faltantes para ver como lo ibamos a manejar. Al correr la función “vis_miss” pudimos obtener un gráfico de valores faltantes en todo el dataframe. La cantidad de datos faltantes aparece ser menos del 5% por lo que podemos ignorarlos y continuar.
vis_miss(Medicos.df)
Medicos.df <- Medicos.df %>%
mutate(IMC = peso / altura)
names(Medicos.df)
## [1] "nombre" "edad" "sexo" "peso" "altura"
## [6] "colesterol" "IMC"
Medicos.df <- Medicos.df %>%
mutate(obesidad= case_when(
IMC < 18.5 ~ "bajo peso",
IMC > 18.5 & IMC <= 24.5 ~ "saludable",
IMC > 24.5 & IMC <=30 ~ "sobre peso",
IMC > 30 ~ "obeso"
))
Medicos.df
## nombre edad sexo peso altura colesterol IMC
## 1 José Luis Martínez Izquierdo 18 H 85 1.79 182 47.48603
## 2 Rosa Díaz Díaz 32 M 65 1.73 232 37.57225
## 3 Javier Garcia Sánchez 24 H NA 1.81 191 NA
## 4 Carmen López Pinzón 35 M 65 1.70 200 38.23529
## 5 Marisa López Collado 46 M 51 1.58 148 32.27848
## 6 Antonio Ruiz Cruz 68 H 66 1.74 249 37.93103
## 7 Antonio Fernández Ocaña 51 H 62 1.72 276 36.04651
## 8 Pilar Martín González 22 M 60 1.66 NA 36.14458
## 9 Pedro Gálvez Tenorio 35 H 90 1.94 241 46.39175
## 10 Santiago Reillo Manzano 46 H 75 1.85 280 40.54054
## 11 Macarena Álvarez Luna 53 M 55 1.62 262 33.95062
## 12 José María Sanz 58 H 78 1.87 198 41.71123
## 13 Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210 55.05051
## 14 Carolina Rubio Moreno 20 M 61 1.77 194 34.46328
## obesidad
## 1 obeso
## 2 obeso
## 3 <NA>
## 4 obeso
## 5 obeso
## 6 obeso
## 7 obeso
## 8 obeso
## 9 obeso
## 10 obeso
## 11 obeso
## 12 obeso
## 13 obeso
## 14 obeso
Medicos.df <- Medicos.df %>%
select(nombre, sexo, everything())
Medicos.df
## nombre sexo edad peso altura colesterol IMC
## 1 José Luis Martínez Izquierdo H 18 85 1.79 182 47.48603
## 2 Rosa Díaz Díaz M 32 65 1.73 232 37.57225
## 3 Javier Garcia Sánchez H 24 NA 1.81 191 NA
## 4 Carmen López Pinzón M 35 65 1.70 200 38.23529
## 5 Marisa López Collado M 46 51 1.58 148 32.27848
## 6 Antonio Ruiz Cruz H 68 66 1.74 249 37.93103
## 7 Antonio Fernández Ocaña H 51 62 1.72 276 36.04651
## 8 Pilar Martín González M 22 60 1.66 NA 36.14458
## 9 Pedro Gálvez Tenorio H 35 90 1.94 241 46.39175
## 10 Santiago Reillo Manzano H 46 75 1.85 280 40.54054
## 11 Macarena Álvarez Luna M 53 55 1.62 262 33.95062
## 12 José María Sanz H 58 78 1.87 198 41.71123
## 13 Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210 55.05051
## 14 Carolina Rubio Moreno M 20 61 1.77 194 34.46328
## obesidad
## 1 obeso
## 2 obeso
## 3 <NA>
## 4 obeso
## 5 obeso
## 6 obeso
## 7 obeso
## 8 obeso
## 9 obeso
## 10 obeso
## 11 obeso
## 12 obeso
## 13 obeso
## 14 obeso
Medicos.df <- Medicos.df %>%
drop_na(colesterol)
Medicos.df
## nombre sexo edad peso altura colesterol IMC
## 1 José Luis Martínez Izquierdo H 18 85 1.79 182 47.48603
## 2 Rosa Díaz Díaz M 32 65 1.73 232 37.57225
## 3 Javier Garcia Sánchez H 24 NA 1.81 191 NA
## 4 Carmen López Pinzón M 35 65 1.70 200 38.23529
## 5 Marisa López Collado M 46 51 1.58 148 32.27848
## 6 Antonio Ruiz Cruz H 68 66 1.74 249 37.93103
## 7 Antonio Fernández Ocaña H 51 62 1.72 276 36.04651
## 8 Pedro Gálvez Tenorio H 35 90 1.94 241 46.39175
## 9 Santiago Reillo Manzano H 46 75 1.85 280 40.54054
## 10 Macarena Álvarez Luna M 53 55 1.62 262 33.95062
## 11 José María Sanz H 58 78 1.87 198 41.71123
## 12 Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210 55.05051
## 13 Carolina Rubio Moreno M 20 61 1.77 194 34.46328
## obesidad
## 1 obeso
## 2 obeso
## 3 <NA>
## 4 obeso
## 5 obeso
## 6 obeso
## 7 obeso
## 8 obeso
## 9 obeso
## 10 obeso
## 11 obeso
## 12 obeso
## 13 obeso
Medicos.df <- Medicos.df %>%
arrange(nombre)
Medicos.df
## nombre sexo edad peso altura colesterol IMC
## 1 Antonio Fernández Ocaña H 51 62 1.72 276 36.04651
## 2 Antonio Ruiz Cruz H 68 66 1.74 249 37.93103
## 3 Carmen López Pinzón M 35 65 1.70 200 38.23529
## 4 Carolina Rubio Moreno M 20 61 1.77 194 34.46328
## 5 Javier Garcia Sánchez H 24 NA 1.81 191 NA
## 6 José Luis Martínez Izquierdo H 18 85 1.79 182 47.48603
## 7 José María Sanz H 58 78 1.87 198 41.71123
## 8 Macarena Álvarez Luna M 53 55 1.62 262 33.95062
## 9 Marisa López Collado M 46 51 1.58 148 32.27848
## 10 Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210 55.05051
## 11 Pedro Gálvez Tenorio H 35 90 1.94 241 46.39175
## 12 Rosa Díaz Díaz M 32 65 1.73 232 37.57225
## 13 Santiago Reillo Manzano H 46 75 1.85 280 40.54054
## obesidad
## 1 obeso
## 2 obeso
## 3 obeso
## 4 obeso
## 5 <NA>
## 6 obeso
## 7 obeso
## 8 obeso
## 9 obeso
## 10 obeso
## 11 obeso
## 12 obeso
## 13 obeso
fem.meddf <- Medicos.df %>%
filter(sexo == "M")
fem.meddf
## nombre sexo edad peso altura colesterol IMC obesidad
## 1 Carmen López Pinzón M 35 65 1.70 200 38.23529 obeso
## 2 Carolina Rubio Moreno M 20 61 1.77 194 34.46328 obeso
## 3 Macarena Álvarez Luna M 53 55 1.62 262 33.95062 obeso
## 4 Marisa López Collado M 46 51 1.58 148 32.27848 obeso
## 5 Rosa Díaz Díaz M 32 65 1.73 232 37.57225 obeso
masc.meddf <- Medicos.df %>%
filter(sexo == "H", edad > 30)
masc.meddf
## nombre sexo edad peso altura colesterol IMC obesidad
## 1 Antonio Fernández Ocaña H 51 62 1.72 276 36.04651 obeso
## 2 Antonio Ruiz Cruz H 68 66 1.74 249 37.93103 obeso
## 3 José María Sanz H 58 78 1.87 198 41.71123 obeso
## 4 Pedro Gálvez Tenorio H 35 90 1.94 241 46.39175 obeso
## 5 Santiago Reillo Manzano H 46 75 1.85 280 40.54054 obeso
anonimo.meddf <- Medicos.df %>%
select(-nombre)
anonimo.meddf
## sexo edad peso altura colesterol IMC obesidad
## 1 H 51 62 1.72 276 36.04651 obeso
## 2 H 68 66 1.74 249 37.93103 obeso
## 3 M 35 65 1.70 200 38.23529 obeso
## 4 M 20 61 1.77 194 34.46328 obeso
## 5 H 24 NA 1.81 191 NA <NA>
## 6 H 18 85 1.79 182 47.48603 obeso
## 7 H 58 78 1.87 198 41.71123 obeso
## 8 M 53 55 1.62 262 33.95062 obeso
## 9 M 46 51 1.58 148 32.27848 obeso
## 10 H 27 109 1.98 210 55.05051 obeso
## 11 H 35 90 1.94 241 46.39175 obeso
## 12 M 32 65 1.73 232 37.57225 obeso
## 13 H 46 75 1.85 280 40.54054 obeso