Introducción

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.

Ejercicio 1

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)

Ejercicio 2

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.

Data frame y visión general

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)
Data summary
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 ▂▇▂▅▅

Observar datos faltantes

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)

Continuando con el ejercicio 2

3. Creación de una nueva columna con el indice de masa corporal, usando IMC = peso/altura:

Medicos.df <- Medicos.df %>%
  mutate(IMC = peso / altura)
names(Medicos.df) 
## [1] "nombre"     "edad"       "sexo"       "peso"       "altura"    
## [6] "colesterol" "IMC"

4. Creación de una nueva variable, denominada obesidad recodificando la columna IMC en 4 categorías de peso:

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

5. Reordenar la base de datos, colocar la columna sexo antes que la columna edad:

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

6. Eliminar las filas con datos faltantes, solo en la columna de colesterol:

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

7. Ordenar la base de datos según la columna de los nombres:

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

8. Crea una nueva base de datos que contenga solo las mujeres:

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

9. Crea una nueva base de datos que contenga hombres mayores de 30 años:

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

10. Crea una nueva base de datos volviéndola anónima (eliminando la columna nombre):

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