2  Preprocesamiento de datos

2.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los paquetes readr y dplyr de la colección de paquetes tidyverse.

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

Ejercicio 2.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
  1. Crear un data frame con los datos de la tabla.

    df <- data.frame(
        Mes = c("Enero", "Febrero", "Marzo"),
        Ingresos = c(45000, 41500, 51200),
        Gastos = c(33400, 35400, 35600)
        )
    df 
          Mes Ingresos Gastos
    1   Enero    45000  33400
    2 Febrero    41500  35400
    3   Marzo    51200  35600
  2. Añadir una nueva columna con los siguientes impuestos pagados.

    Mes Impuestos
    Enero 6450
    Febrero 6300
    Marzo 7100

    Con las funciones básicas de R.

    df$Impuestos <- c(6450, 6300, 7100)
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100

    Con las funciones del paquete dplyr.

    df <- df |>
        mutate(Impuestos = c(6450, 6300, 7100))
    df
          Mes Ingresos Gastos Impuestos
    1   Enero    45000  33400      6450
    2 Febrero    41500  35400      6300
    3   Marzo    51200  35600      7100
  3. Añadir una nueva fila con los siguientes datos de Abril.

    Mes Ingresos Gastos Impuestos
    Abril 49700 36300 6850

    Con las funciones básicas de R.

    df <- rbind(df, list(Mes = "Abril", Ingresos = 49700, Gastos = 36300, Impuestos = 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

    Con las funciones del paquete dplyr.

    df <- df |>
        add_row(Mes = "Abril", Ingresos = 49700, Gastos = 36300, Impuestos = 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
  4. Cambiar los ingresos de Marzo por 50400.

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

    Con las funciones básicas 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    50400  35600      7100       7700
    4   Abril    49700  36300      6850       6550

    Con las funciones del paquete dplyr.

    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    50400  35600      7100       7700
    4   Abril    49700  36300      6850       6550
  6. 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 las funciones básicas de R.

    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    50400  35600      7100       7700 positivo
    4   Abril    49700  36300      6850       6550 positivo

    Con las funciones del paquete dplyr.

    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    50400  35600      7100       7700 positivo
    4   Abril    49700  36300      6850       6550 positivo
  7. 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 básicas de R.

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

    Con las funciones del paquete dplyr.

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

Ejercicio 2.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 básicas de R.

    df <- read.csv("https://raw.githubusercontent.com/asalber/estadistica-practicas-r/main/datos/colesterol.csv")

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

    df <- read_csv("https://raw.githubusercontent.com/asalber/estadistica-practicas-r/main/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.
  2. Mostrar el contenido del data frame.

    Con las funciones básicas de R.

    df 
    # A tibble: 14 × 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
     7 Antonio Fernández Ocaña            51 H        62   1.72        276
     8 Pilar Martín González              22 M        60   1.66         NA
     9 Pedro Gálvez Tenorio               35 H        90   1.94        241
    10 Santiago Reillo Manzano            46 H        75   1.85        280
    11 Macarena Álvarez Luna              53 M        55   1.62        262
    12 José María de la Guía Sanz         58 H        78   1.87        198
    13 Miguel Angel Cuadrado Gutiérrez    27 H       109   1.98        210
    14 Carolina Rubio Moreno              20 M        61   1.77        194

    Con la función glimpse del paquete dplyr. Esta función muestra las columnas del data frame en filas, de manera que permite ver todas las columnas de un data frame cuando este tiene muchas columnas.

    Rows: 14
    Columns: 6
    $ nombre     <chr> "José Luis Martínez Izquierdo", "Rosa Díaz Díaz", "Javier G…
    $ edad       <dbl> 18, 32, 24, 35, 46, 68, 51, 22, 35, 46, 53, 58, 27, 20
    $ sexo       <chr> "H", "M", "H", "M", "M", "H", "H", "M", "H", "H", "M", "H",…
    $ peso       <dbl> 85, 65, NA, 65, 51, 66, 62, 60, 90, 75, 55, 78, 109, 61
    $ altura     <dbl> 1.79, 1.73, 1.81, 1.70, 1.58, 1.74, 1.72, 1.66, 1.94, 1.85,…
    $ colesterol <dbl> 182, 232, 191, 200, 148, 249, 276, NA, 241, 280, 262, 198, …
  3. Crear una nueva columna con el índice de masa corporal, usando la siguiente fórmula

    \[ \mbox{IMC} = \frac{\mbox{Peso (kg)}}{\mbox{Altura (cm)}^2} \]

    df <- df |>
        mutate(imc = round(peso/altura^2))
    df
    # A tibble: 14 × 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
     7 Antonio Fernández Ocaña            51 H        62   1.72        276    21
     8 Pilar Martín González              22 M        60   1.66         NA    22
     9 Pedro Gálvez Tenorio               35 H        90   1.94        241    24
    10 Santiago Reillo Manzano            46 H        75   1.85        280    22
    11 Macarena Álvarez Luna              53 M        55   1.62        262    21
    12 José María de la Guía Sanz         58 H        78   1.87        198    22
    13 Miguel Angel Cuadrado Gutiérrez    27 H       109   1.98        210    28
    14 Carolina Rubio Moreno              20 M        61   1.77        194    19
  4. 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
    df <- df |>
        mutate(Obesidad = cut(imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso")))
    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         NA    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…
  5. Seleccionar las columnas nombre, sexo y edad.

    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
  6. Anonimizar los datos eliminando la columna nombre.

    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
  7. Reordenar las columnas poniendo la columna sexo antes que la columna edad.

    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…
  8. Filtrar el data frame para quedarse con las mujeres.

    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
  9. Filtrar el data frame para quedarse con los hombres mayores de 30 años.

    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
  10. Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.

    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. Ordenar el data frame según la columna nombre.

    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         NA    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…
  12. Ordenar el data frame ascendentemente por la columna sexo y descendentemente por la columna edad.

    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         NA    22 Saludab…
    14 Carolina Rubio Moreno         20 M        61   1.77        194    19 Saludab…

Ejercicio 2.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://raw.githubusercontent.com/asalber/estadistica-practicas-r/main/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.

    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

2.2 Ejercicios Propuestos

Ejercicio 2.4 La siguiente tabla recoge las notas de los alumnos de un curso con dos asignaturas.

Alumno Sexo Física Química
Carlos H 6.7 8.1
María M 7.2 9.5
Carmen M 5.5 5
Pedro H 4.5
Luis H 3.5 5
Sara M 6.2 4
  1. Definir cuatro vectores con el nombre, el sexo y las notas de Física y Química.

    nombre <- c("Carlos", "María", "Carmen", "Pedro", "Luis", "Sara")
    sexo <- c("H", "M", "M", "H", "H", "M")
    fisica <- c(6.7, 7.2, 5.5, NA, 3.5, 6.2)
    quimica <- c(8.1, 9.5, 5, 4.5, 5, 4)
  2. Convertir el sexo en un factor y mostrar sus niveles.

    sexo <- factor(sexo)
    levels(sexo)
    [1] "H" "M"
  3. Crear un data frame con el nombre, sexo y las notas de Física y Química.

    df <- data.frame(nombre, sexo, fisica, quimica)
    df
      nombre sexo fisica quimica
    1 Carlos    H    6.7     8.1
    2  María    M    7.2     9.5
    3 Carmen    M    5.5     5.0
    4  Pedro    H     NA     4.5
    5   Luis    H    3.5     5.0
    6   Sara    M    6.2     4.0
  4. Crear una nueva columna con la nota media de Física y Química.

    df$media <- (df$fisica + df$quimica) / 2
    df
      nombre sexo fisica quimica media
    1 Carlos    H    6.7     8.1  7.40
    2  María    M    7.2     9.5  8.35
    3 Carmen    M    5.5     5.0  5.25
    4  Pedro    H     NA     4.5    NA
    5   Luis    H    3.5     5.0  4.25
    6   Sara    M    6.2     4.0  5.10
  5. Crear una nueva columna booleana aprobado que tenga el valor TRUE si la media es mayor o igual que 5 y FALSE en caso contrario.

    df$aprobado <- df$media >= 5
    df
      nombre sexo fisica quimica media aprobado
    1 Carlos    H    6.7     8.1  7.40     TRUE
    2  María    M    7.2     9.5  8.35     TRUE
    3 Carmen    M    5.5     5.0  5.25     TRUE
    4  Pedro    H     NA     4.5    NA       NA
    5   Luis    H    3.5     5.0  4.25    FALSE
    6   Sara    M    6.2     4.0  5.10     TRUE
  6. Filtrar el data frame para quedarse con el nombre y la media de las mujeres que han aprobado.

    df[df$sexo == "M" & df$media >= 5, c("nombre", "media")]
      nombre media
    2  María  8.35
    3 Carmen  5.25
    6   Sara  5.10

Ejercicio 2.5 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 (fichero de csv datos-hospital-a.csv).

  2. Crear un data frame con los datos de los pacientes del hospital B (fichero csv datos-hospital-b.csv).

  3. Fusionar los datos de los dos hospitales en un nuevo data frame.

    Para fusionar las filas de dos data frames con las mismas columnas usar la función rbind.

  4. Crear un data frame con los datos de las claves de aleatorización (fichero csv claves-aleatorizacion.csv)

  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 usar la función left_join del paquete dplyr.

  6. Convertir en un factor el sexo.

  7. Crear una nueva columna para la evolución de la presión arterial diastólica restando las columnas PAS_FIN y PAS_FIN.