3  Preprocesamiento de datos

Esta práctica contiene ejercicios que muestran como preprocesar un conjunto de datos en R. El preprocesamiento de datos es una tarea fundamental en el análisis de datos que consiste en la limpieza, transformación y preparación de los datos para su análisis. El preprocesamiento de datos incluye tareas como

3.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los siguientes paquetes.

library(tidyverse) 
# Incluye los siguientes paquetes:
# - readr: para la lectura de ficheros csv. 
# - dplyr: para el preprocesamiento y manipulación de datos.
# - lubridate: para el procesamiento de fechas.

Ejercicio 3.1 La siguiente tabla contiene los ingresos y gastos de una empresa durante el primer trimestre del año.

Mes Ingresos Gastos Impuestos
Enero 45000 33400 6450
Febrero 41500 35400 6300
Marzo 51200 35600 7100
Abril 49700 36300 6850
  1. Crear un data frame con los datos de la tabla.

    df <- data.frame(
        Mes = c("Enero", "Febrero", "Marzo", "Abril"),
        Ingresos = c(45000, 41500, 51200, 49700),
        Gastos = c(33400, 35400, 35600, 36300),
        Impuestos = c(6450, 6300, 7100, 6850)
        )
    df 
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100
    4   Abril    49700  36300      6850
  2. Crear una nueva columna con los beneficios de cada mes (ingresos - gastos - impuestos).

    Con las funciones del paquete base de R.

    df$Beneficios <- df$Ingresos - df$Gastos - df$Impuestos
    df
          Mes Ingresos Gastos Impuestos Beneficios
    1   Enero    45000  33400      6450       5150
    2 Febrero    41500  35400      6300       -200
    3   Marzo    51200  35600      7100       8500
    4   Abril    49700  36300      6850       6550

    Con la función mutate del paquete dplyr de tidyverse. La función mutate permite añadir nuevas columnas a un data frame mediante una fórmula puede hacer referencia a las columnas existentes.

    df <- df |>
        mutate(Beneficios = Ingresos - Gastos - Impuestos)
    df
          Mes Ingresos Gastos Impuestos Beneficios
    1   Enero    45000  33400      6450       5150
    2 Febrero    41500  35400      6300       -200
    3   Marzo    51200  35600      7100       8500
    4   Abril    49700  36300      6850       6550
  3. Crear una nueva columna con el factor Balance con dos posibles categorías: positivo si ha habido beneficios y negativo si ha habido pérdidas.

    Con la función cut del paquete base de R. La función cut(vector, breaks, labels) divide el vector vector en intervalos delimitados por los elementos del vector breaks y crea un factor asignando a cada intervalo una etiqueta del vector labels.

    df$Balance <- cut(df$Beneficios, breaks = c(-Inf, 0, Inf), labels = c("negativo", "positivo"))
    df
          Mes Ingresos Gastos Impuestos Beneficios  Balance
    1   Enero    45000  33400      6450       5150 positivo
    2 Febrero    41500  35400      6300       -200 negativo
    3   Marzo    51200  35600      7100       8500 positivo
    4   Abril    49700  36300      6850       6550 positivo

    Con la función mutate del paquete dplyr de tidyverse.

    df <- df |>
        mutate(Balance = cut(Beneficios, breaks = c(-Inf, 0, Inf), labels = c("negativo", "positivo")))
    df
          Mes Ingresos Gastos Impuestos Beneficios  Balance
    1   Enero    45000  33400      6450       5150 positivo
    2 Febrero    41500  35400      6300       -200 negativo
    3   Marzo    51200  35600      7100       8500 positivo
    4   Abril    49700  36300      6850       6550 positivo
  4. Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.

    Con las funciones del paquete base de R.

    df[df$Balance == "positivo", c("Mes", "Beneficios")]
        Mes Beneficios
    1 Enero       5150
    3 Marzo       8500
    4 Abril       6550

    Con las funciones filter y select del paquete dplyr de tidyverse. La función filter permite seleccionar las filas de un data frame que cumplen una condición. La función select permite seleccionar las columnas de un data frame.

    df |>
        filter(Balance == "positivo") |> 
        select(Mes, Beneficios)
        Mes Beneficios
    1 Enero       5150
    2 Marzo       8500
    3 Abril       6550

Ejercicio 3.2 El fichero colesterol.csv contiene información de una muestra de pacientes donde se han medido la edad, el sexo, el peso, la altura y el nivel de colesterol, además de su nombre.

  1. Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero colesterol.csv.

    Con las funciones del paquete base de R.

    df <- read.csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    head(df)
                            nombre edad sexo peso altura colesterol
    1 José Luis Martínez Izquierdo   18    H   85   1.79        182
    2               Rosa Díaz Díaz   32    M   65   1.73        232
    3        Javier García Sánchez   24    H   NA   1.81        191
    4          Carmen López Pinzón   35    M   65   1.70        200
    5         Marisa López Collado   46    M   51   1.58        148
    6            Antonio Ruiz Cruz   68    H   66   1.74        249

    Con la función read_csv del paquete del paquete readr de tidyverse.

    df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    Rows: 14 Columns: 6
    ── Column specification ────────────────────────────────────────────────────────
    Delimiter: ","
    chr (2): nombre, sexo
    dbl (4): edad, peso, altura, colesterol
    
    ℹ Use `spec()` to retrieve the full column specification for this data.
    ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    head(df)
    # A tibble: 6 × 6
      nombre                        edad sexo   peso altura colesterol
      <chr>                        <dbl> <chr> <dbl>  <dbl>      <dbl>
    1 José Luis Martínez Izquierdo    18 H        85   1.79        182
    2 Rosa Díaz Díaz                  32 M        65   1.73        232
    3 Javier García Sánchez           24 H        NA   1.81        191
    4 Carmen López Pinzón             35 M        65   1.7         200
    5 Marisa López Collado            46 M        51   1.58        148
    6 Antonio Ruiz Cruz               68 H        66   1.74        249
  2. Crear una nueva columna con el índice de masa corporal, usando la siguiente fórmula

    IMC=Peso (kg)Altura (cm)2

    Con las funciones del paquete base de R.

    df$imc <- round(df$peso/df$altura^2)
    head(df)
    # A tibble: 6 × 7
      nombre                        edad sexo   peso altura colesterol   imc
      <chr>                        <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl>
    1 José Luis Martínez Izquierdo    18 H        85   1.79        182    27
    2 Rosa Díaz Díaz                  32 M        65   1.73        232    22
    3 Javier García Sánchez           24 H        NA   1.81        191    NA
    4 Carmen López Pinzón             35 M        65   1.7         200    22
    5 Marisa López Collado            46 M        51   1.58        148    20
    6 Antonio Ruiz Cruz               68 H        66   1.74        249    22

    Con la función mutate del paquete dplyr de tidyverse.

    df <- df |> mutate(imc = round(peso/altura^2))
    head(df)
    # A tibble: 6 × 7
      nombre                        edad sexo   peso altura colesterol   imc
      <chr>                        <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl>
    1 José Luis Martínez Izquierdo    18 H        85   1.79        182    27
    2 Rosa Díaz Díaz                  32 M        65   1.73        232    22
    3 Javier García Sánchez           24 H        NA   1.81        191    NA
    4 Carmen López Pinzón             35 M        65   1.7         200    22
    5 Marisa López Collado            46 M        51   1.58        148    20
    6 Antonio Ruiz Cruz               68 H        66   1.74        249    22
  3. Crear una nueva columna con la variable obesidad recodificando la columna imc en las siguientes categorías.

    Rango IMC Categoría
    Menor de 18.5 Bajo peso
    De 18.5 a 24.5 Saludable
    De 24.5 a 30 Sobrepeso
    Mayor de 30 Obeso

    Con la función cut del paquete base de R.

    df$Obesidad <- cut(df$imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso"))
    head(df)
    # A tibble: 6 × 8
      nombre                       edad sexo   peso altura colesterol   imc Obesidad
      <chr>                       <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
    1 José Luis Martínez Izquier…    18 H        85   1.79        182    27 Sobrepe…
    2 Rosa Díaz Díaz                 32 M        65   1.73        232    22 Saludab…
    3 Javier García Sánchez          24 H        NA   1.81        191    NA <NA>    
    4 Carmen López Pinzón            35 M        65   1.7         200    22 Saludab…
    5 Marisa López Collado           46 M        51   1.58        148    20 Saludab…
    6 Antonio Ruiz Cruz              68 H        66   1.74        249    22 Saludab…

    Con las funciones del paquete dplyr de tidyverse.

    df <- df |>
        mutate(Obesidad = cut(imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso")))
    head(df)
    # A tibble: 6 × 8
      nombre                       edad sexo   peso altura colesterol   imc Obesidad
      <chr>                       <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
    1 José Luis Martínez Izquier…    18 H        85   1.79        182    27 Sobrepe…
    2 Rosa Díaz Díaz                 32 M        65   1.73        232    22 Saludab…
    3 Javier García Sánchez          24 H        NA   1.81        191    NA <NA>    
    4 Carmen López Pinzón            35 M        65   1.7         200    22 Saludab…
    5 Marisa López Collado           46 M        51   1.58        148    20 Saludab…
    6 Antonio Ruiz Cruz              68 H        66   1.74        249    22 Saludab…
  4. Seleccionar las columnas nombre, sexo y edad.

    Con las funciones del paquete base de R.

    df[, c("nombre", "sexo", "edad")]
    # A tibble: 14 × 3
       nombre                          sexo   edad
       <chr>                           <chr> <dbl>
     1 José Luis Martínez Izquierdo    H        18
     2 Rosa Díaz Díaz                  M        32
     3 Javier García Sánchez           H        24
     4 Carmen López Pinzón             M        35
     5 Marisa López Collado            M        46
     6 Antonio Ruiz Cruz               H        68
     7 Antonio Fernández Ocaña         H        51
     8 Pilar Martín González           M        22
     9 Pedro Gálvez Tenorio            H        35
    10 Santiago Reillo Manzano         H        46
    11 Macarena Álvarez Luna           M        53
    12 José María de la Guía Sanz      H        58
    13 Miguel Angel Cuadrado Gutiérrez H        27
    14 Carolina Rubio Moreno           M        20

    Con la función select del paquete dplyr de tidyverse.

    df |> select(nombre, sexo, edad)
    # A tibble: 14 × 3
       nombre                          sexo   edad
       <chr>                           <chr> <dbl>
     1 José Luis Martínez Izquierdo    H        18
     2 Rosa Díaz Díaz                  M        32
     3 Javier García Sánchez           H        24
     4 Carmen López Pinzón             M        35
     5 Marisa López Collado            M        46
     6 Antonio Ruiz Cruz               H        68
     7 Antonio Fernández Ocaña         H        51
     8 Pilar Martín González           M        22
     9 Pedro Gálvez Tenorio            H        35
    10 Santiago Reillo Manzano         H        46
    11 Macarena Álvarez Luna           M        53
    12 José María de la Guía Sanz      H        58
    13 Miguel Angel Cuadrado Gutiérrez H        27
    14 Carolina Rubio Moreno           M        20
  5. Anonimizar los datos eliminando la columna nombre.

    Con las funciones del paquete base de R.

    df[, -1]
    # A tibble: 14 × 7
        edad sexo   peso altura colesterol   imc Obesidad 
       <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
     1    18 H        85   1.79        182    27 Sobrepeso
     2    32 M        65   1.73        232    22 Saludable
     3    24 H        NA   1.81        191    NA <NA>     
     4    35 M        65   1.7         200    22 Saludable
     5    46 M        51   1.58        148    20 Saludable
     6    68 H        66   1.74        249    22 Saludable
     7    51 H        62   1.72        276    21 Saludable
     8    22 M        60   1.66         NA    22 Saludable
     9    35 H        90   1.94        241    24 Saludable
    10    46 H        75   1.85        280    22 Saludable
    11    53 M        55   1.62        262    21 Saludable
    12    58 H        78   1.87        198    22 Saludable
    13    27 H       109   1.98        210    28 Sobrepeso
    14    20 M        61   1.77        194    19 Saludable

    Con la función select del paquete dplyr de tidyverse.

    df |> select(-nombre)
    # A tibble: 14 × 7
        edad sexo   peso altura colesterol   imc Obesidad 
       <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
     1    18 H        85   1.79        182    27 Sobrepeso
     2    32 M        65   1.73        232    22 Saludable
     3    24 H        NA   1.81        191    NA <NA>     
     4    35 M        65   1.7         200    22 Saludable
     5    46 M        51   1.58        148    20 Saludable
     6    68 H        66   1.74        249    22 Saludable
     7    51 H        62   1.72        276    21 Saludable
     8    22 M        60   1.66         NA    22 Saludable
     9    35 H        90   1.94        241    24 Saludable
    10    46 H        75   1.85        280    22 Saludable
    11    53 M        55   1.62        262    21 Saludable
    12    58 H        78   1.87        198    22 Saludable
    13    27 H       109   1.98        210    28 Sobrepeso
    14    20 M        61   1.77        194    19 Saludable
  6. Reordenar las columnas poniendo la columna sexo antes que la columna edad.

    Con las funciones del paquete base de R.

    df[, c(1, 3, 2, 4, 5, 6)]
    # A tibble: 14 × 6
       nombre                          sexo   edad  peso altura colesterol
       <chr>                           <chr> <dbl> <dbl>  <dbl>      <dbl>
     1 José Luis Martínez Izquierdo    H        18    85   1.79        182
     2 Rosa Díaz Díaz                  M        32    65   1.73        232
     3 Javier García Sánchez           H        24    NA   1.81        191
     4 Carmen López Pinzón             M        35    65   1.7         200
     5 Marisa López Collado            M        46    51   1.58        148
     6 Antonio Ruiz Cruz               H        68    66   1.74        249
     7 Antonio Fernández Ocaña         H        51    62   1.72        276
     8 Pilar Martín González           M        22    60   1.66         NA
     9 Pedro Gálvez Tenorio            H        35    90   1.94        241
    10 Santiago Reillo Manzano         H        46    75   1.85        280
    11 Macarena Álvarez Luna           M        53    55   1.62        262
    12 José María de la Guía Sanz      H        58    78   1.87        198
    13 Miguel Angel Cuadrado Gutiérrez H        27   109   1.98        210
    14 Carolina Rubio Moreno           M        20    61   1.77        194

    Con la función select del paquete dplyr de tidyverse.

    df |> select(nombre, sexo, edad, everything())
    # A tibble: 14 × 8
       nombre                     sexo   edad  peso altura colesterol   imc Obesidad
       <chr>                      <chr> <dbl> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie… H        18    85   1.79        182    27 Sobrepe…
     2 Rosa Díaz Díaz             M        32    65   1.73        232    22 Saludab…
     3 Javier García Sánchez      H        24    NA   1.81        191    NA <NA>    
     4 Carmen López Pinzón        M        35    65   1.7         200    22 Saludab…
     5 Marisa López Collado       M        46    51   1.58        148    20 Saludab…
     6 Antonio Ruiz Cruz          H        68    66   1.74        249    22 Saludab…
     7 Antonio Fernández Ocaña    H        51    62   1.72        276    21 Saludab…
     8 Pilar Martín González      M        22    60   1.66         NA    22 Saludab…
     9 Pedro Gálvez Tenorio       H        35    90   1.94        241    24 Saludab…
    10 Santiago Reillo Manzano    H        46    75   1.85        280    22 Saludab…
    11 Macarena Álvarez Luna      M        53    55   1.62        262    21 Saludab…
    12 José María de la Guía Sanz H        58    78   1.87        198    22 Saludab…
    13 Miguel Angel Cuadrado Gut… H        27   109   1.98        210    28 Sobrepe…
    14 Carolina Rubio Moreno      M        20    61   1.77        194    19 Saludab…
  7. Filtrar el data frame para quedarse con las mujeres.

    Con las funciones del paquete base de R.

    df[df$sexo == "M", ]
    # A tibble: 6 × 8
      nombre                 edad sexo   peso altura colesterol   imc Obesidad 
      <chr>                 <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
    1 Rosa Díaz Díaz           32 M        65   1.73        232    22 Saludable
    2 Carmen López Pinzón      35 M        65   1.7         200    22 Saludable
    3 Marisa López Collado     46 M        51   1.58        148    20 Saludable
    4 Pilar Martín González    22 M        60   1.66         NA    22 Saludable
    5 Macarena Álvarez Luna    53 M        55   1.62        262    21 Saludable
    6 Carolina Rubio Moreno    20 M        61   1.77        194    19 Saludable

    Con la función filter del paquete dplyr de tidyverse.

    df |> filter(sexo == "M")
    # A tibble: 6 × 8
      nombre                 edad sexo   peso altura colesterol   imc Obesidad 
      <chr>                 <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
    1 Rosa Díaz Díaz           32 M        65   1.73        232    22 Saludable
    2 Carmen López Pinzón      35 M        65   1.7         200    22 Saludable
    3 Marisa López Collado     46 M        51   1.58        148    20 Saludable
    4 Pilar Martín González    22 M        60   1.66         NA    22 Saludable
    5 Macarena Álvarez Luna    53 M        55   1.62        262    21 Saludable
    6 Carolina Rubio Moreno    20 M        61   1.77        194    19 Saludable
  8. Filtrar el data frame para quedarse con los hombres mayores de 30 años.

    Con las funciones del paquete base de R.

    df[df$sexo == "H" & df$edad > 30, ]    
    # A tibble: 5 × 8
      nombre                      edad sexo   peso altura colesterol   imc Obesidad 
      <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
    1 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludable
    2 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludable
    3 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludable
    4 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludable
    5 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludable

    Con la función filter paquete dplyr de tidyverse.

    df |> filter( sexo == "H" & edad > 30)
    # A tibble: 5 × 8
      nombre                      edad sexo   peso altura colesterol   imc Obesidad 
      <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>    
    1 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludable
    2 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludable
    3 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludable
    4 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludable
    5 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludable
  9. Filtrar el data frame para quedarse con las filas sin valores perdidos.

    Con la función na.omit del paquete base de R. La función na.omit elimina las filas con valores perdidos.

    # A tibble: 12 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79        182    27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73        232    22 Saludab…
     3 Carmen López Pinzón           35 M        65   1.7         200    22 Saludab…
     4 Marisa López Collado          46 M        51   1.58        148    20 Saludab…
     5 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludab…
     6 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludab…
     7 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludab…
     8 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludab…
     9 Macarena Álvarez Luna         53 M        55   1.62        262    21 Saludab…
    10 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludab…
    11 Miguel Angel Cuadrado Gut…    27 H       109   1.98        210    28 Sobrepe…
    12 Carolina Rubio Moreno         20 M        61   1.77        194    19 Saludab…

    Con la función drop_na del paquete tidyr de tidyverse.

    df |> drop_na()
    # A tibble: 12 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79        182    27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73        232    22 Saludab…
     3 Carmen López Pinzón           35 M        65   1.7         200    22 Saludab…
     4 Marisa López Collado          46 M        51   1.58        148    20 Saludab…
     5 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludab…
     6 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludab…
     7 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludab…
     8 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludab…
     9 Macarena Álvarez Luna         53 M        55   1.62        262    21 Saludab…
    10 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludab…
    11 Miguel Angel Cuadrado Gut…    27 H       109   1.98        210    28 Sobrepe…
    12 Carolina Rubio Moreno         20 M        61   1.77        194    19 Saludab…
  10. Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.

    Con las funciones del paquete base de R. La función is.na devuelve TRUE cuando se aplica a un valor perdido NA. Cuando se aplica a un vector devuelve un vector lógico con TRUE en las posiciones con valores perdidos y FALSE en las posiciones con valores no perdidos.

    df[!is.na(df$colesterol), ]
    # A tibble: 13 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79        182    27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73        232    22 Saludab…
     3 Javier García Sánchez         24 H        NA   1.81        191    NA <NA>    
     4 Carmen López Pinzón           35 M        65   1.7         200    22 Saludab…
     5 Marisa López Collado          46 M        51   1.58        148    20 Saludab…
     6 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludab…
     7 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludab…
     8 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludab…
     9 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludab…
    10 Macarena Álvarez Luna         53 M        55   1.62        262    21 Saludab…
    11 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludab…
    12 Miguel Angel Cuadrado Gut…    27 H       109   1.98        210    28 Sobrepe…
    13 Carolina Rubio Moreno         20 M        61   1.77        194    19 Saludab…

    Con la función filter del paquete dplyr de tidyverse.

    df |> filter(!is.na(colesterol))
    # A tibble: 13 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79        182    27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73        232    22 Saludab…
     3 Javier García Sánchez         24 H        NA   1.81        191    NA <NA>    
     4 Carmen López Pinzón           35 M        65   1.7         200    22 Saludab…
     5 Marisa López Collado          46 M        51   1.58        148    20 Saludab…
     6 Antonio Ruiz Cruz             68 H        66   1.74        249    22 Saludab…
     7 Antonio Fernández Ocaña       51 H        62   1.72        276    21 Saludab…
     8 Pedro Gálvez Tenorio          35 H        90   1.94        241    24 Saludab…
     9 Santiago Reillo Manzano       46 H        75   1.85        280    22 Saludab…
    10 Macarena Álvarez Luna         53 M        55   1.62        262    21 Saludab…
    11 José María de la Guía Sanz    58 H        78   1.87        198    22 Saludab…
    12 Miguel Angel Cuadrado Gut…    27 H       109   1.98        210    28 Sobrepe…
    13 Carolina Rubio Moreno         20 M        61   1.77        194    19 Saludab…
  11. Imputar los valores perdidos en la columna colesterol con la media de los valores no perdidos.

    Con la función mean del paquete base de R. La función mean calcula la media de un vector. Para que no se tengan en cuenta los valores perdidos se puede usar el argumento na.rm = TRUE.

    media_colesterol <- mean(df$colesterol, na.rm = TRUE)
    df$colesterol[is.na(df$colesterol)] <- media_colesterol
    df
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
     3 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     4 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
     5 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
     6 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     7 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     8 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
     9 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
    10 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…
    11 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
    12 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
    13 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
    14 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…

    Con la función mutate del paquete dplyr de tidyverse. La función ifelse permite asignar un valor a un vector en función de una condición.

    df <- df |>
        mutate(colesterol = ifelse(is.na(colesterol), mean(colesterol, na.rm = TRUE), colesterol))
    df
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     2 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
     3 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     4 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
     5 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
     6 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     7 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     8 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
     9 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
    10 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…
    11 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
    12 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
    13 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
    14 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…
  12. Ordenar el data frame según la columna nombre.

    Con la función order del paquete base de R. La función order devuelve un vector con los índices de las filas ordenadas de menor a mayor.

    df[order(df$nombre), ]
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     2 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     3 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
     4 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…
     5 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     6 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     7 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
     8 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
     9 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
    10 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
    11 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
    12 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
    13 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
    14 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…

    Con la función arrange del paquete dplyr de tidyverse.

    df |> arrange(nombre)
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     2 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     3 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
     4 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…
     5 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     6 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     7 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
     8 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
     9 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
    10 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
    11 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
    12 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
    13 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
    14 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…
  13. Ordenar el data frame ascendentemente por la columna sexo y descendentemente por la columna edad.

    Con las funciones del paquete base de R.

    df[order(df$sexo, -df$edad), ]
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     2 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
     3 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     4 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…
     5 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
     6 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
     7 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     8 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     9 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
    10 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
    11 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
    12 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
    13 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
    14 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…

    Con la función arrange del paquete dplyr de tidyverse. Para que la ordenación sea descendente con respecto a una variable se tiene que usar la función desc sobre la variable.

    df |>
        arrange(sexo, desc(edad))
    # A tibble: 14 × 8
       nombre                      edad sexo   peso altura colesterol   imc Obesidad
       <chr>                      <dbl> <chr> <dbl>  <dbl>      <dbl> <dbl> <fct>   
     1 Antonio Ruiz Cruz             68 H        66   1.74       249     22 Saludab…
     2 José María de la Guía Sanz    58 H        78   1.87       198     22 Saludab…
     3 Antonio Fernández Ocaña       51 H        62   1.72       276     21 Saludab…
     4 Santiago Reillo Manzano       46 H        75   1.85       280     22 Saludab…
     5 Pedro Gálvez Tenorio          35 H        90   1.94       241     24 Saludab…
     6 Miguel Angel Cuadrado Gut…    27 H       109   1.98       210     28 Sobrepe…
     7 Javier García Sánchez         24 H        NA   1.81       191     NA <NA>    
     8 José Luis Martínez Izquie…    18 H        85   1.79       182     27 Sobrepe…
     9 Macarena Álvarez Luna         53 M        55   1.62       262     21 Saludab…
    10 Marisa López Collado          46 M        51   1.58       148     20 Saludab…
    11 Carmen López Pinzón           35 M        65   1.7        200     22 Saludab…
    12 Rosa Díaz Díaz                32 M        65   1.73       232     22 Saludab…
    13 Pilar Martín González         22 M        60   1.66       220.    22 Saludab…
    14 Carolina Rubio Moreno         20 M        61   1.77       194     19 Saludab…

Ejercicio 3.3 El fichero notas-curso2.csv contiene las notas de las asignaturas de un curso en varios grupos de alumnos.

  1. Crear un data frame con los datos del curso a partir del fichero notas-curso2.csv.

    df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/notas-curso2.csv")
    Rows: 120 Columns: 9
    ── Column specification ────────────────────────────────────────────────────────
    Delimiter: ","
    chr (4): sexo, turno, grupo, trabaja
    dbl (5): notaA, notaB, notaC, notaD, notaE
    
    ℹ Use `spec()` to retrieve the full column specification for this data.
    ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    df
    # A tibble: 120 × 9
       sexo   turno  grupo trabaja notaA notaB notaC notaD notaE
       <chr>  <chr>  <chr> <chr>   <dbl> <dbl> <dbl> <dbl> <dbl>
     1 Mujer  Tarde  C     N         5.2   6.3   3.4   2.3   2  
     2 Hombre Mañana A     N         5.7   5.7   4.2   3.5   2.7
     3 Hombre Mañana B     N         8.3   8.8   8.8   8     5.5
     4 Hombre Mañana B     N         6.1   6.8   4     3.5   2.2
     5 Hombre Mañana A     N         6.2   9     5     4.4   3.7
     6 Hombre Mañana A     S         8.6   8.9   9.5   8.4   3.9
     7 Mujer  Mañana A     N         6.7   7.9   5.6   4.8   4.2
     8 Mujer  Tarde  C     S         4.1   5.2   1.7   0.3   1  
     9 Hombre Tarde  C     N         5     5     3.3   2.7   6  
    10 Hombre Tarde  C     N         5.3   6.3   4.8   3.6   2.3
    # ℹ 110 more rows
  2. Convertir el data frame a formato largo.

    Para convertir un data frame de formato ancho a largo se puede usar la función pivot_longer del paquete tidyr de tidyverse.

    df_largo <- df |> pivot_longer(notaA:notaE, names_to = "Asignatura", values_to = "Nota")
    df_largo
    # A tibble: 600 × 6
       sexo   turno  grupo trabaja Asignatura  Nota
       <chr>  <chr>  <chr> <chr>   <chr>      <dbl>
     1 Mujer  Tarde  C     N       notaA        5.2
     2 Mujer  Tarde  C     N       notaB        6.3
     3 Mujer  Tarde  C     N       notaC        3.4
     4 Mujer  Tarde  C     N       notaD        2.3
     5 Mujer  Tarde  C     N       notaE        2  
     6 Hombre Mañana A     N       notaA        5.7
     7 Hombre Mañana A     N       notaB        5.7
     8 Hombre Mañana A     N       notaC        4.2
     9 Hombre Mañana A     N       notaD        3.5
    10 Hombre Mañana A     N       notaE        2.7
    # ℹ 590 more rows
  3. Crear una nueva columna con la variable calificación que contenga las calificaciones de cada asignatura.

    df_largo <- df_largo |>
        mutate(Califiación = cut(Nota, breaks = c(0, 4.99, 6.99, 8.99, 10), labels = c("SS", "AP", "NT", "SB")))
    df_largo
    # A tibble: 600 × 7
       sexo   turno  grupo trabaja Asignatura  Nota Califiación
       <chr>  <chr>  <chr> <chr>   <chr>      <dbl> <fct>      
     1 Mujer  Tarde  C     N       notaA        5.2 AP         
     2 Mujer  Tarde  C     N       notaB        6.3 AP         
     3 Mujer  Tarde  C     N       notaC        3.4 SS         
     4 Mujer  Tarde  C     N       notaD        2.3 SS         
     5 Mujer  Tarde  C     N       notaE        2   SS         
     6 Hombre Mañana A     N       notaA        5.7 AP         
     7 Hombre Mañana A     N       notaB        5.7 AP         
     8 Hombre Mañana A     N       notaC        4.2 SS         
     9 Hombre Mañana A     N       notaD        3.5 SS         
    10 Hombre Mañana A     N       notaE        2.7 SS         
    # ℹ 590 more rows
  4. Filtrar el conjunto de datos para obtener las asignaturas y las notas de las mujeres del grupo A, ordenadas de mayor a menor.

    df_largo |>
        filter(sexo == "Mujer", grupo == "A") |>
        select(Asignatura, Nota) |>
        arrange(desc(Nota))
    # A tibble: 75 × 2
       Asignatura  Nota
       <chr>      <dbl>
     1 notaB        9.2
     2 notaE        9.2
     3 notaB        8.8
     4 notaB        8.6
     5 notaB        8.6
     6 notaA        8.3
     7 notaB        8.2
     8 notaB        8.1
     9 notaA        8  
    10 notaB        8  
    # ℹ 65 more rows

Ejercicio 3.4 Se ha diseñado un ensayo clínico aleatorizado, doble-ciego y controlado con placebo, para estudiar el efecto de dos alternativas terapéuticas en el control de la hipertensión arterial. Se han reclutado 100 pacientes hipertensos y estos han sido distribuidos aleatoriamente en tres grupos de tratamiento. A uno de los grupos (control) se le administró un placebo, a otro grupo se le administró un inhibidor de la enzima conversora de la angiotensina (IECA) y al otro un tratamiento combinado de un diurético y un Antagonista del Calcio. Las variables respuesta final fueron las presiones arteriales sistólica y diastólica.

Los datos con las claves de aleatorización han sido introducidos en una base de datos que reside en la central de aleatorización, mientras que los datos clínicos han sido archivados en dos archivos distintos, uno para cada uno de los dos centros participantes en el estudio.

Las variables almacenadas en estos archivos clínicos son las siguientes:

  • CLAVE: Clave de aleatorización
  • NOMBRE: Iniciales del paciente
  • F_NACIM: Fecha de Nacimiento
  • F_INCLUS: Fecha de inclusión
  • SEXO: Sexo (0: Hombre 1: Mujer)
  • ALTURA: Altura en cm.
  • PESO: Peso en Kg.
  • PAD_INI: Presión diastólica basal (inicial)
  • PAD_FIN: Presión diastólica final
  • PAS_INI: Presión sistólica basal (inicial)
  • PAS_FIN: Presión sistólica final

El archivo de claves de aleatorización contiene sólo dos variables.

  • CLAVE: Clave de aleatorización
  • FARMACO: Fármaco administrado (0: Placebo, 1: IECA, 2:Ca Antagonista + diurético)
  1. Crear un data frame con los datos de los pacientes del hospital A del fichero de Excel datos-hospital-a.xls.

    library(readxl)
    dfA <- read_excel("datos/hipertension/datos-hospital-a.xls")
    head(dfA)
    # A tibble: 6 × 12
      CLAVE NOMBRE F_NACIM             F_INCLUS             SEXO ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <dbl>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00     1    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00     1    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00     0    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00     0    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00     1    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00     0    179    80     22
    # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>
  2. Crear un data frame con los datos de los pacientes del hospital B del fichero csv datos-hospital-b.csv.

    dfB <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/hipertension/datos-hospital-b.csv")
    Rows: 90 Columns: 12
    ── Column specification ────────────────────────────────────────────────────────
    Delimiter: ","
    chr  (1): NOMBRE
    dbl  (9): CLAVE, SEXO, ALTURA, PESO, ESTRES, PAD_INI, PAD_FIN, PAS_INI, PAS_FIN
    date (2): F_NACIM, F_INCLUS
    
    ℹ Use `spec()` to retrieve the full column specification for this data.
    ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    head(dfB)
    # A tibble: 6 × 12
      CLAVE NOMBRE F_NACIM    F_INCLUS    SEXO ALTURA  PESO ESTRES PAD_INI PAD_FIN
      <dbl> <chr>  <date>     <date>     <dbl>  <dbl> <dbl>  <dbl>   <dbl>   <dbl>
    1    11 VSH    1965-12-15 1999-12-06     0    170    59   32        90      82
    2    12 SZS    1971-03-07 1999-02-13     1    154    61   20.2      92     102
    3    13 JSS    1964-01-03 1998-10-31     1    162    49   30        86      94
    4    14 BMH    1941-08-16 1999-09-16     0    162    77   26        93      77
    5    15 DGM    1969-01-24 1999-08-19     1    173    95   18        81      77
    6    16 POJ    1966-10-22 2000-10-29     1    177    63   19        72      96
    # ℹ 2 more variables: PAS_INI <dbl>, PAS_FIN <dbl>
  3. Fusionar los datos de los dos hospitales en un nuevo data frame.

    Con la función rbind del paquete base de R.

    df <- rbind(dfA, dfB)
    head(df)
    # A tibble: 6 × 12
      CLAVE NOMBRE F_NACIM             F_INCLUS             SEXO ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <dbl>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00     1    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00     1    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00     0    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00     0    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00     1    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00     0    179    80     22
    # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>

    Con la función bind_rows del paquete dplyr de tidyverse.

    df <- dfA |> bind_rows(dfB)
    head(df)
    # A tibble: 6 × 12
      CLAVE NOMBRE F_NACIM             F_INCLUS             SEXO ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <dbl>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00     1    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00     1    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00     0    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00     0    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00     1    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00     0    179    80     22
    # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>
  4. Crear un data frame con los datos de las claves de aleatorización del fichero csv claves-aleatorizacion.csv.

    claves <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/hipertension/claves-aleatorizacion.csv")
    Rows: 100 Columns: 2
    ── Column specification ────────────────────────────────────────────────────────
    Delimiter: ","
    chr (1): FARMACO
    dbl (1): CLAVE
    
    ℹ Use `spec()` to retrieve the full column specification for this data.
    ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    head(claves)
    # A tibble: 6 × 2
      CLAVE FARMACO                   
      <dbl> <chr>                     
    1     1 Ca Antagonista + Diurético
    2     2 Ca Antagonista + Diurético
    3     3 Placebo                   
    4     4 Ca Antagonista + Diurético
    5     5 Ca Antagonista + Diurético
    6     6 Placebo                   
  5. Fusionar el data frame con los datos clínicos y el data frame con claves de aleatorización en un nuevo data frame.

    Para fusionar las columnas de dos data frames usando una misma columna como clave en ambos data frames se puede la función left_join del paquete dplyr de tidyverse.

    df <- df |> left_join(claves, by = "CLAVE")
    head(df)
    # A tibble: 6 × 13
      CLAVE NOMBRE F_NACIM             F_INCLUS             SEXO ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <dbl>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00     1    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00     1    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00     0    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00     0    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00     1    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00     0    179    80     22
    # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>, FARMACO <chr>
  6. Convertir la columna del sexo en un factor con dos niveles: Hombre y Mujer.

    Con la función del paquete base de R.

    df$SEXO <- factor(df$SEXO, levels = c(0, 1), labels = c("Hombre", "Mujer"))
    head(df)
    # A tibble: 6 × 13
      CLAVE NOMBRE F_NACIM             F_INCLUS            SEXO  ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <fct>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00 Mujer    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00 Mujer    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00 Homb…    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00 Homb…    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00 Mujer    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00 Homb…    179    80     22
    # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>, FARMACO <chr>

    Con la función mutate del paquete dplyr de tidyverse.

    df <- df |> mutate(SEXO = factor(SEXO, levels = c(0, 1), labels = c("Hombre", "Mujer")))
    head(df)
    # A tibble: 6 × 13
      CLAVE NOMBRE F_NACIM             F_INCLUS            SEXO  ALTURA  PESO ESTRES
      <dbl> <chr>  <dttm>              <dttm>              <fct>  <dbl> <dbl>  <dbl>
    1     1 SGL    1941-09-08 00:00:00 1998-07-13 00:00:00 Mujer    165    78     42
    2     2 JCZ    1957-07-10 00:00:00 1998-05-09 00:00:00 Mujer    154    74     30
    3     3 APZ    1967-08-18 00:00:00 2000-04-01 00:00:00 Homb…    156    81     21
    4     4 NDG    1956-05-08 00:00:00 1998-11-13 00:00:00 Homb…    181    82     33
    5     5 CLO    1958-11-02 00:00:00 1999-02-24 00:00:00 Mujer    184    78     36
    6     6 LFZ    1953-06-13 00:00:00 2000-03-16 00:00:00 Homb…    179    80     22
    # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>,
    #   PAS_FIN <dbl>, FARMACO <chr>
  7. Crear una nueva columna con la edad de los pacientes en el momento de inclusión en el estudio.

    Con la función del paquete base de R.

    df$EDAD <- as.numeric(difftime(df$F_INCLUS, df$F_NACIM, units = "days")/365)
    head(df[, c("F_NACIM", "F_INCLUS", "EDAD")])
    # A tibble: 6 × 3
      F_NACIM             F_INCLUS             EDAD
      <dttm>              <dttm>              <dbl>
    1 1941-09-08 00:00:00 1998-07-13 00:00:00  56.9
    2 1957-07-10 00:00:00 1998-05-09 00:00:00  40.9
    3 1967-08-18 00:00:00 2000-04-01 00:00:00  32.6
    4 1956-05-08 00:00:00 1998-11-13 00:00:00  42.5
    5 1958-11-02 00:00:00 1999-02-24 00:00:00  40.3
    6 1953-06-13 00:00:00 2000-03-16 00:00:00  46.8

    Con las funciones interval y time_length del paquete lubridate de tidyverse. La función interval permite crear un intervalo de tiempo entre dos fechas y la función time_length permite calcular la longitud de un intervalo en una determinada unidad de tiempo.

    df <- df |> mutate(AGE = time_length(interval(F_NACIM, F_INCLUS), "years"))
    head(df |>  select(F_NACIM, F_INCLUS, AGE))
    # A tibble: 6 × 3
      F_NACIM             F_INCLUS              AGE
      <dttm>              <dttm>              <dbl>
    1 1941-09-08 00:00:00 1998-07-13 00:00:00  56.8
    2 1957-07-10 00:00:00 1998-05-09 00:00:00  40.8
    3 1967-08-18 00:00:00 2000-04-01 00:00:00  32.6
    4 1956-05-08 00:00:00 1998-11-13 00:00:00  42.5
    5 1958-11-02 00:00:00 1999-02-24 00:00:00  40.3
    6 1953-06-13 00:00:00 2000-03-16 00:00:00  46.8
  8. Crear una nueva columna con el índice de masa corporal (IMC) de los pacientes.

    Con las funciones del paquete base de R.

    df$IMC <- df$PESO/(df$ALTURA/100)^2
    head(df[, c("PESO", "ALTURA", "IMC")])
    # A tibble: 6 × 3
       PESO ALTURA   IMC
      <dbl>  <dbl> <dbl>
    1    78    165  28.7
    2    74    154  31.2
    3    81    156  33.3
    4    82    181  25.0
    5    78    184  23.0
    6    80    179  25.0

    Con la función mutate del paquete dplyr de tidyverse.

    df <- df |> mutate(IMC = PESO/(ALTURA/100)^2)
    head(df |> select(PESO, ALTURA, IMC))
    # A tibble: 6 × 3
       PESO ALTURA   IMC
      <dbl>  <dbl> <dbl>
    1    78    165  28.7
    2    74    154  31.2
    3    81    156  33.3
    4    82    181  25.0
    5    78    184  23.0
    6    80    179  25.0
  9. Crear una nueva columna para la evolución de la presión arterial diastólica y otra con la evolución de la presión arterial sistólica.

    Con las funciones del paquete base de R.

    df$EVOL_PAD <- df$PAD_FIN - df$PAD_INI
    df$EVOL_PAS <- df$PAS_FIN - df$PAS_INI
    head(df[, c("PAD_INI", "PAD_FIN", "EVOL_PAD", "PAS_INI", "PAS_FIN", "EVOL_PAS")])
    # A tibble: 6 × 6
      PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS
        <dbl>   <dbl>    <dbl>   <dbl>   <dbl>    <dbl>
    1      78     104       26     176     175       -1
    2      95     114       19     162     160       -2
    3      93     102        9     141     150        9
    4      86      91        5     162     161       -1
    5      89      94        5     165     162       -3
    6      74      99       25     141     148        7

    Con la función mutate del paquete dplyr de tidyverse.

    df <- df |> mutate(EVOL_PAD = PAD_FIN - PAD_INI, EVOL_PAS = PAS_FIN - PAS_INI)
    head(df |> select(PAD_INI, PAD_FIN, EVOL_PAD, PAS_INI, PAS_FIN, EVOL_PAS))
    # A tibble: 6 × 6
      PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS
        <dbl>   <dbl>    <dbl>   <dbl>   <dbl>    <dbl>
    1      78     104       26     176     175       -1
    2      95     114       19     162     160       -2
    3      93     102        9     141     150        9
    4      86      91        5     162     161       -1
    5      89      94        5     165     162       -3
    6      74      99       25     141     148        7
  10. Guardar el data frame en un fichero csv.

    Con la función write.csv del paquete base de R.

    write.csv(df, "datos/hipertension/datos-ensayo-clinico.csv")

    Con la función write_csv del paquete readr de tidyverse.

    df  |> write_csv("datos/hipertension/datos-ensayo-clinico.csv")

3.2 Ejercicios Propuestos

Ejercicio 3.5 Los ficheros vinos-blancos.xls y vinos-tintos.csv contienen información sobre las características de vinos blancos y tintos portugueses de la denominación “Vinho Verde”. Las variables almacenadas en estos archivos son las siguientes:

Variable Descripción Tipo (unidades)
tipo Tipo de vino Factor (blanco, tinto)
meses.barrica Mesesde envejecimiento en barrica Numérica(meses)
acided.fija Cantidadde ácidotartárico Numérica(g/dm3)
acided.volatil Cantidad de ácido acético Numérica(g/dm3)
acido.citrico Cantidad de ácidocítrico Numérica(g/dm3)
azucar.residual Cantidad de azúcarremanente después de la fermentación Numérica(g/dm3)
cloruro.sodico Cantidad de clorurosódico Numérica(g/dm3)
dioxido.azufre.libre Cantidad de dióxido de azufreen formalibre Numérica(mg/dm3)
dioxido.azufre.total Cantidadde dióxido de azufretotal en forma libre o ligada Numérica(mg/dm3)
densidad Densidad Numérica(g/cm3)
ph pH Numérica(0-14)
sulfatos Cantidadde sulfato de potasio Numérica(g/dm3)
alcohol Porcentajede contenidode alcohol Numérica(0-100)
calidad Calificación otorgada porun panel de expertos Numérica(0-10)
  1. Crear un data frame con los datos de los vinos blancos partir del fichero de Excel vinos-blancos.xlsx.

  2. Crear un data frame con los datos de los vinos tintos partir del fichero csv vinos-tintos.csv.

  3. Fusionar los datos de los vinos blancos y tintos en un nuevo data frame.

  4. Convertir el tipo de vino en un factor.

  5. Imputar los valores perdidos del alcohol con la media de los valores no perdidos para cada tipo de vino.

  6. Crear un factor Envejecimiento recodificando la variable meses.barrica en las siguientes categorías.

    Rango en meses Categoría
    Menos de 3 Joven
    Entre 3 y 12 Crianza
    Entre 12 y 18 Reserva
    Más de 18 Gran reserva
  7. Crear un factor Dulzor recodificando la variable azucar.residual en las siguientes categorías.

    Rango azúcar Categoría
    Menos de 4 Seco
    Más de 4 y menos de 12 Semiseco
    Más de 12 y menos de 45 Semidulce
    Más de 45 Dulce
  8. Filtrar el conjunto de datos para quedarse con los vinos Reserva o Gran Reserva con una calidad superior a 7 y ordenar el data frame por calidad de forma descendente.

  9. ¿Cuántos vinos blancos con un contenido en alcohol superior al 12% y una calidad superior a 8 hay en el conjunto de datos?