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.
# - tidyr: para la organización de los datos.
# - lubridate: para el procesamiento de fechas.
library(knitr) # Para el formateo de tablas.

dplyrknitrlubridatereadr

Si se va a usar Copilot para resolver los ejercicios se recomienda añadir el siguiente contexto al comienzo del script o al fichero r.instructions.md.

---
name: "Reglas de programación para R"
applyTo: "**/*.[rR], **/*.qmd"
---

## Reglas de programación para R

- Usar tidyverse para todas las tareas de preprocesamiento (dplyr/tidyr/readr/stringr/lubridate/forcats/purrr).
- Preferir tuberías con |> (o %>% si se usa en el archivo).
- Evitar la manipulación de datos en base R (merge, aggregate, subset) a menos que se solicite explícitamente.
- Mantener el código legible y usar verbos explícitos: select, mutate, summarise, group_by, pivot_longer/wider.
- Cuando no haya ambigüedad no antepongas el nombre del paquete a la función.
- En los nombres de variables y valores respetar el uso de mayúsculas y minúsculas (camelCase o snake_case) y ser consistente en todo el código.
- No generar nuevos data frames, ni modificar los asistentes, salvo cuando se indique explícitamente.
- Utiliza el prefijo `df_` para los nombres de los data frames.
- Organizar las salidas con la función tidy del paquete broom y mostrar solo las columnas relevantes (estimate, std.error, statistic, p.value).
- Mostrar los data frames o las tablas con la función kable del paquete knitr.
- Para gráficos usar ggplot2 y mantener un estilo limpio y profesional.

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
    Enero 45000 33400 6450
    Febrero 41500 35400 6300
    Marzo 51200 35600 7100
    Abril 49700 36300 6850
  2. Crear una nueva columna con los beneficios de cada mes (ingresos - gastos - impuestos).

    Para añadir una nueva columna a partir de una fórmula podemos usar la sintaxis df$variable <- fórmula para crear una nueva columna en el data frame df con nombre variable. Para asignar los valores de la nueva columna se usa la fórmula indicada. Una fórmula puede hacer referencia a otras columnas existentes y contener operadores aritméticos, lógicos o funciones.

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

    Para añadir una nueva columna a un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    • mutate(variable = fórmula). Añade al data frame df una nueva columna con nombre variable y valores generados mediante la fórmula fórmula. Una fórmula puede hacer referencia a otras columnas existentes y contener operadores aritméticos, lógicos o funciones.
    library(tidyverse)
    df <- df |>
        mutate(Beneficios = Ingresos - Gastos - Impuestos)
    df
    Mes Ingresos Gastos Impuestos Beneficios
    Enero 45000 33400 6450 5150
    Febrero 41500 35400 6300 -200
    Marzo 51200 35600 7100 8500
    Abril 49700 36300 6850 6550
    Añadir al data frame df una nueva columna de nombre Beneficios con los beneficios de cada mes.
  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.

    Para asignar un valor a una nueva columna a partir de una condición podemos usar la siguiente función del paquete base de R:

    Y para convertir la nueva columna en un factor con dos niveles se puede usar la siguiente función del paquete base de R:

    • factor(variable, levels = niveles, labels = etiquetas) del paquete base de R. Convierte la variable en un factor. Se pueden especificar los niveles del factor con el argumento levels y las etiquetas de los niveles con el argumento labels. Si no se especifican los niveles se asignan en orden alfabético. Si no se especifican las etiquetas se asignan los mismos valores que los niveles.
    df$Balance <- factor(ifelse(df$Beneficios > 0, "positivo", "negativo"), levels = c("positivo", "negativo"))
    df
    Mes Ingresos Gastos Impuestos Beneficios Balance
    Enero 45000 33400 6450 5150 positivo
    Febrero 41500 35400 6300 -200 negativo
    Marzo 51200 35600 7100 8500 positivo
    Abril 49700 36300 6850 6550 positivo

    Para añadir una nueva columna a un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    • mutate(variable = fórmula). Añade al data frame df una nueva columna con nombre variable y valores generados mediante la fórmula fórmula.

    Para asignar un valor a una nueva columna a partir de una condición podemos usar la siguiente función del paquete base de R:

    Y para convertir la nueva columna en un factor con dos niveles se puede usar la siguiente función del paquete base de R:

    • factor(variable, levels = niveles, labels = etiquetas). Convierte la variable en un factor. Se pueden especificar los niveles del factor con el argumento levels y las etiquetas de los niveles con el argumento labels. Si no se especifican los niveles se asignan en orden alfabético. Si no se especifican las etiquetas se asignan los mismos valores que los niveles.
    df <- df |>
        mutate(Balance = factor(if_else(Beneficios > 0, "positivo", "negativo"),
                     levels = c("positivo", "negativo")))
    df
    Mes Ingresos Gastos Impuestos Beneficios Balance
    Enero 45000 33400 6450 5150 positivo
    Febrero 41500 35400 6300 -200 negativo
    Marzo 51200 35600 7100 8500 positivo
    Abril 49700 36300 6850 6550 positivo
    Añadir una nueva columna con el factor Balance con dos posibles niveles: positivo si la columna Beneficios es mayor o igual que 0 y negativo si la columna Beneficios es menor que 0. Los niveles deben estar enb el orden siguiente: positivo, negativo.
  4. Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.

    Para filtrar un data frame podemos usar la siguiente sintaxis

    • df[condición, columnas]. Devuelve un data frame con las filas que cumplan la condición y las columnas indicadas en columnas. La condición se puede construir usando operadores lógicos y de comparación sobre las columnas del data frame. Para indicar las columnas se pueden usar los nombres de las columnas entre comillas o los índices de las columnas.
    df[df$Balance == "positivo", c("Mes", "Beneficios")]
    Mes Beneficios
    1 Enero 5150
    3 Marzo 8500
    4 Abril 6550

    Para filtrar un data frame podemos usar las siguientes funciones del paquete dplyr de tidyverse:

    • filter(df, condición). Devuelve un data frame con las filas del data frame df que cumplen la condición. La condición se puede construir usando operadores lógicos y de comparación sobre las columnas del data frame.
    • select(columnas). Devuelve un data frame con las columnas del data frame df indicadas en columnas.
    df |>
        filter(Balance == "positivo") |> 
        select(Mes, Beneficios)
    Mes Beneficios
    Enero 5150
    Marzo 8500
    Abril 6550
    Filtrar el conjunto de datos para quedarse con la columna Mes y la columna Beneficios de los meses en los que la columna Balance contenga el valor positivo.

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.

    Para crear un data frame a partir de un fichero csv podemos usar siguiente función del paquete base de R:

    • read.csv(fichero/url). Lee el fichero csv desde la ruta dada por fichero o la url dada por url y devuelve un data frame con los datos del fichero. Se puede usar la ruta local del fichero o la url si el fichero está en internet.
    df <- read.csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    head(df)
    nombre edad sexo peso altura colesterol
    José Luis Martínez Izquierdo 18 H 85 1.79 182
    Rosa Díaz Díaz 32 M 65 1.73 232
    Javier García Sánchez 24 H NA 1.81 191
    Carmen López Pinzón 35 M 65 1.70 200
    Marisa López Collado 46 M 51 1.58 148
    Antonio Ruiz Cruz 68 H 66 1.74 249

    Para crear un data frame a partir de un fichero csv podemos usar la siguiente función del paquete readr de tidyverse:

    • read_csv(fichero/url). Lee el fichero csv desde la ruta dada por fichero o la url dada por url y devuelve un data frame con los datos del fichero. Se puede usar la ruta local del fichero o la url si el fichero está en internet.
    df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
    head(df)
    nombre edad sexo peso altura colesterol
    José Luis Martínez Izquierdo 18 H 85 1.79 182
    Rosa Díaz Díaz 32 M 65 1.73 232
    Javier García Sánchez 24 H NA 1.81 191
    Carmen López Pinzón 35 M 65 1.70 200
    Marisa López Collado 46 M 51 1.58 148
    Antonio Ruiz Cruz 68 H 66 1.74 249
    Crear un data frame con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/colesterol.csv.
  2. 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$imc <- round(df$peso/df$altura^2)
    head(df)
    nombre edad sexo peso altura colesterol imc
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27
    Rosa Díaz Díaz 32 M 65 1.73 232 22
    Javier García Sánchez 24 H NA 1.81 191 NA
    Carmen López Pinzón 35 M 65 1.70 200 22
    Marisa López Collado 46 M 51 1.58 148 20
    Antonio Ruiz Cruz 68 H 66 1.74 249 22

    Para añadir una nueva columna a un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    df <- df |> mutate(imc = round(peso/altura^2))
    head(df)
    nombre edad sexo peso altura colesterol imc
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27
    Rosa Díaz Díaz 32 M 65 1.73 232 22
    Javier García Sánchez 24 H NA 1.81 191 NA
    Carmen López Pinzón 35 M 65 1.70 200 22
    Marisa López Collado 46 M 51 1.58 148 20
    Antonio Ruiz Cruz 68 H 66 1.74 249 22
    Crear una nueva columna de nombre IMC con el índice de masa corporal de los pacientes usando la fórmula IMC = peso / altura^2. Redondear el resultado a números enteros.
  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

    Para categorizar la columna imc en las diferentes categorías de obesidad, podemos usar la siguiente función del paquete base de R:

    • [cut(vector, breaks, labels)](https://rdrr.io/r/base/cut.html). 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$Obesidad <- cut(df$imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso"))
    head(df)
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191 NA NA
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable

    Para añadir una nueva columna a un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    Para categorizar la columna imc en las diferentes categorías de obesidad, en la fórmula podemos la siguiente función del paquete base de R:

    • cut(vector, breaks, labels) del paquete base de R. 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 <- df |>
        mutate(Obesidad = cut(imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso")))
    head(df)
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191 NA NA
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Usar la función cut para crear una nueva columna de nombre Obesidad con la clasificación de obesidad de los pacientes según su IMC. La clasificación se realiza según los siguientes intervalos:
    - Bajo peso: IMC menor de 18.5
    - Saludable: IMC de 18.5 a 24.5
    - Sobrepeso: IMC de 24.5 a 30
    - Obeso: IMC mayor de 30.
  4. Seleccionar las columnas nombre, sexo y edad.

    df[, c("nombre", "sexo", "edad")]
    nombre sexo edad
    José Luis Martínez Izquierdo H 18
    Rosa Díaz Díaz M 32
    Javier García Sánchez H 24
    Carmen López Pinzón M 35
    Marisa López Collado M 46
    Antonio Ruiz Cruz H 68
    Antonio Fernández Ocaña H 51
    Pilar Martín González M 22
    Pedro Gálvez Tenorio H 35
    Santiago Reillo Manzano H 46
    Macarena Álvarez Luna M 53
    José María de la Guía Sanz H 58
    Miguel Angel Cuadrado Gutiérrez H 27
    Carolina Rubio Moreno M 20

    Para seleccionar columnas de un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    • select(df, columnas). Devuelve un data frame con las columnas del data frame df indicadas en columnas.
    df |> select(nombre, sexo, edad)
    nombre sexo edad
    José Luis Martínez Izquierdo H 18
    Rosa Díaz Díaz M 32
    Javier García Sánchez H 24
    Carmen López Pinzón M 35
    Marisa López Collado M 46
    Antonio Ruiz Cruz H 68
    Antonio Fernández Ocaña H 51
    Pilar Martín González M 22
    Pedro Gálvez Tenorio H 35
    Santiago Reillo Manzano H 46
    Macarena Álvarez Luna M 53
    José María de la Guía Sanz H 58
    Miguel Angel Cuadrado Gutiérrez H 27
    Carolina Rubio Moreno M 20
    Seleccionar las columnas nombre, sexo y edad del data frame df.
  5. Anonimizar los datos eliminando la columna nombre.

    df[, -1]
    edad sexo peso altura colesterol imc Obesidad
    18 H 85 1.79 182 27 Sobrepeso
    32 M 65 1.73 232 22 Saludable
    24 H NA 1.81 191 NA NA
    35 M 65 1.70 200 22 Saludable
    46 M 51 1.58 148 20 Saludable
    68 H 66 1.74 249 22 Saludable
    51 H 62 1.72 276 21 Saludable
    22 M 60 1.66 NA 22 Saludable
    35 H 90 1.94 241 24 Saludable
    46 H 75 1.85 280 22 Saludable
    53 M 55 1.62 262 21 Saludable
    58 H 78 1.87 198 22 Saludable
    27 H 109 1.98 210 28 Sobrepeso
    20 M 61 1.77 194 19 Saludable

    Para eliminar columnas de un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    • select(df, -columnas). Devuelve un data frame con las columnas del data frame df menos las columnas indicadas en columnas.
    df |> select(-nombre)
    edad sexo peso altura colesterol imc Obesidad
    18 H 85 1.79 182 27 Sobrepeso
    32 M 65 1.73 232 22 Saludable
    24 H NA 1.81 191 NA NA
    35 M 65 1.70 200 22 Saludable
    46 M 51 1.58 148 20 Saludable
    68 H 66 1.74 249 22 Saludable
    51 H 62 1.72 276 21 Saludable
    22 M 60 1.66 NA 22 Saludable
    35 H 90 1.94 241 24 Saludable
    46 H 75 1.85 280 22 Saludable
    53 M 55 1.62 262 21 Saludable
    58 H 78 1.87 198 22 Saludable
    27 H 109 1.98 210 28 Sobrepeso
    20 M 61 1.77 194 19 Saludable
    Eliminar la columna nombre del data frame.
  6. Reordenar las columnas poniendo la columna sexo antes que la columna edad.

    Para reordenar las columnas del data frame en el orden deseado, podemos usar la siguiente sintaxis:

    • df[, columnas]. Devuelve un data frame con las columnas del data frame df indicadas en columnas. Indicar las columnas en el orden deseado usando los nombres de las columnas entre comillas o los índices de las columnas.
    df[, c(1, 3, 2, 4, 5, 6)]
    nombre sexo edad peso altura colesterol
    José Luis Martínez Izquierdo H 18 85 1.79 182
    Rosa Díaz Díaz M 32 65 1.73 232
    Javier García Sánchez H 24 NA 1.81 191
    Carmen López Pinzón M 35 65 1.70 200
    Marisa López Collado M 46 51 1.58 148
    Antonio Ruiz Cruz H 68 66 1.74 249
    Antonio Fernández Ocaña H 51 62 1.72 276
    Pilar Martín González M 22 60 1.66 NA
    Pedro Gálvez Tenorio H 35 90 1.94 241
    Santiago Reillo Manzano H 46 75 1.85 280
    Macarena Álvarez Luna M 53 55 1.62 262
    José María de la Guía Sanz H 58 78 1.87 198
    Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210
    Carolina Rubio Moreno M 20 61 1.77 194

    Para reordenar las columnas del data frame en el orden deseado, podemos usar la siguiente función del paquete dplyr de tidyverse:

    • select(df, columnas). Devuelve un data frame con las columnas del data frame df indicadas en columnas. Indicar las columnas en el orden deseado usando los nombres de las columnas entre comillas o los índices de las columnas.
    df |> select(nombre, sexo, edad, everything())
    nombre sexo edad peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo H 18 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz M 32 65 1.73 232 22 Saludable
    Javier García Sánchez H 24 NA 1.81 191 NA NA
    Carmen López Pinzón M 35 65 1.70 200 22 Saludable
    Marisa López Collado M 46 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz H 68 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña H 51 62 1.72 276 21 Saludable
    Pilar Martín González M 22 60 1.66 NA 22 Saludable
    Pedro Gálvez Tenorio H 35 90 1.94 241 24 Saludable
    Santiago Reillo Manzano H 46 75 1.85 280 22 Saludable
    Macarena Álvarez Luna M 53 55 1.62 262 21 Saludable
    José María de la Guía Sanz H 58 78 1.87 198 22 Saludable
    Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210 28 Sobrepeso
    Carolina Rubio Moreno M 20 61 1.77 194 19 Saludable
    Reordenar las columnas del data frame poniendo la columna sexo antes que la columna edad.
  7. Filtrar el data frame para quedarse con las mujeres.

    Para filtrar un data frame podemos usar la siguiente sintaxis:

    • df[condición, ]. Devuelve un data frame con las filas del data frame df que satisfacen la condición indicada. La condición se puede construir usando operadores lógicos y de comparación sobre las columnas del data frame.
    df[df$sexo == "M", ]
    nombre edad sexo peso altura colesterol imc Obesidad
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Pilar Martín González 22 M 60 1.66 NA 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable

    Para filtrar un data frame podemos usar la siguiente función del paquete dplyr de tidyverse:

    • filter(df, condición). Devuelve un data frame con las filas del data frame df que satisfacen la condición indicada. Indicar la condición usando operadores lógicos y de comparación sobre las columnas del data frame.
    df |> filter(sexo == "M")
    nombre edad sexo peso altura colesterol imc Obesidad
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Pilar Martín González 22 M 60 1.66 NA 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable
    Filtrar el data frame para quedarse con las filas en las que la columna sexo contenga el valor M.
  8. Filtrar el data frame para quedarse con los hombres mayores de 30 años.

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

    Podemos combinar condiciones usando operadores lógicos. Para que se cumplan varias condiciones a la vez se tiene que usar el operador lógico & entre las condiciones. Para que se cumpla al menos una de varias condiciones se tiene que usar el operador lógico | entre las condiciones.

    df |> filter( sexo == "H" & edad > 30)
    nombre edad sexo peso altura colesterol imc Obesidad
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
    Filtrar el data frame para quedarse con las filas en las que la columna sexo contenga el valor H y la columna edad contenga un valor mayor que 30.
  9. Filtrar el data frame para quedarse con las filas sin valores perdidos.

    Para eliminar las filas que contienen valores perdidos podemos usar la siguiente función del paquete base de R:

    • na.omit(df). Devuelve el data frame que resulta de eliminar las filas con valores perdidos del data frame df.
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable

    Para eliminar las filas que contienen valores perdidos podemos usar la siguiente función del paquete tidyr de tidyverse:

    • drop_na(df). Devuelve el data frame que resulta de eliminar las filas con valores perdidos del data frame df.
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable
    Filtrar el data frame para eliminar las filas con datos perdidos en alguna columna.
  10. Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.

    Para eliminar las filas de un data frame que contienen valores perdidos en una determinada columna podemos filtrar el data frame usando en la condición del filtro la siguiente función del paquete base de R:

    • 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), ]
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191 NA NA
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable

    Para eliminar las filas de un data frame que contienen valores perdidos en una determinada columna podemos filtrar el data frame usando en la condición del filtro la siguiente función del paquete base de R:

    • 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 |> filter(!is.na(colesterol))
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191 NA NA
    Carmen López Pinzón 35 M 65 1.70 200 22 Saludable
    Marisa López Collado 46 M 51 1.58 148 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable
    Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.
  11. Imputar los valores perdidos en la columna colesterol con la media de los valores no perdidos.

    Para imputar valores perdidos en una columna con la media de los valores no perdidos de la misma columna, primero debemos filtrar el data frame para quedarnos con las filas que contienen un valor perdido en la columna indicada. Después podemos asignarle la media de los valores de la columna. Para calcular la media de una columna de un data frame podemos usar la siguiente función del paquete base de R:

    media_colesterol <- mean(df$colesterol, na.rm = TRUE)
    df$colesterol[is.na(df$colesterol)] <- media_colesterol
    df
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable

    Para modificar una columna de un data frame a partir de una fórmula podemos usar la siguiente función del paquete dplyr de tidyverse:

    • mutate(df, variable = fórmula). Añade al data frame df una nueva columna con nombre variable y valores generados mediante la fórmula fórmula. Indicar el nombre de una columna existente para modificar los valores de la columna.

    Para imputar los valores perdidos de una columna con la media de los valores no perdidos de la misma columna, en la fórmula podemos usar las siguientes funciones del paquete base de R:

    df <- df |>
        mutate(colesterol = if_else(is.na(colesterol), mean(colesterol, na.rm = TRUE), colesterol))
    df
    nombre edad sexo peso altura colesterol imc Obesidad
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable
    Imputar los valores perdidos de la columna colesterol con la media de los valores no perdidos de la misma columna.
  12. Ordenar el data frame según la columna nombre.

    Para ordenar las filas de un data frame según el valor de una columna, podemos usar la siguiente función del paquete base de R:

    • order(columna). Devuleve un vector con los índices de las filas ordenadas de menor a mayor. Anteponer un - a la columna para ordenar de mayor a menor. Usar el vector de índices para reordenar las filas del data frame.
    df[order(df$nombre), ]
    nombre edad sexo peso altura colesterol imc Obesidad
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable

    Para ordenar las filas de un data frame según el valor de una columna, podemos usar la siguiente función del paquete dplyr de tidyverse:

    • arrange(df, columnas). Ordena las filas del data frame df según las columnas indicadas en columnas. Indicar las columnas en el orden de prioridad para la ordenación. Usar la función desc(columna) para ordenar de mayor a menor según una columna.
    df |> arrange(nombre)
    nombre edad sexo peso altura colesterol imc Obesidad
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable
    Ordenar el data frame según la columna nombre de menor a mayor.
  13. Ordenar el data frame ascendentemente por la columna sexo y descendentemente por la columna edad.

    df[order(df$sexo, -df$edad), ]
    nombre edad sexo peso altura colesterol imc Obesidad
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable
    df |>
        arrange(sexo, desc(edad))
    nombre edad sexo peso altura colesterol imc Obesidad
    Antonio Ruiz Cruz 68 H 66 1.74 249.0000 22 Saludable
    José María de la Guía Sanz 58 H 78 1.87 198.0000 22 Saludable
    Antonio Fernández Ocaña 51 H 62 1.72 276.0000 21 Saludable
    Santiago Reillo Manzano 46 H 75 1.85 280.0000 22 Saludable
    Pedro Gálvez Tenorio 35 H 90 1.94 241.0000 24 Saludable
    Miguel Angel Cuadrado Gutiérrez 27 H 109 1.98 210.0000 28 Sobrepeso
    Javier García Sánchez 24 H NA 1.81 191.0000 NA NA
    José Luis Martínez Izquierdo 18 H 85 1.79 182.0000 27 Sobrepeso
    Macarena Álvarez Luna 53 M 55 1.62 262.0000 21 Saludable
    Marisa López Collado 46 M 51 1.58 148.0000 20 Saludable
    Carmen López Pinzón 35 M 65 1.70 200.0000 22 Saludable
    Rosa Díaz Díaz 32 M 65 1.73 232.0000 22 Saludable
    Pilar Martín González 22 M 60 1.66 220.2308 22 Saludable
    Carolina Rubio Moreno 20 M 61 1.77 194.0000 19 Saludable
    Ordenar el data frame según la columna sexo de menor a mayor. Si hay filas con el mismo valor en la columna sexo, ordenarlas según la columna edad de mayor a menor.

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")
    df
    sexo turno grupo trabaja notaA notaB notaC notaD notaE
    Mujer Tarde C N 5.2 6.3 3.4 2.3 2.0
    Hombre Mañana A N 5.7 5.7 4.2 3.5 2.7
    Hombre Mañana B N 8.3 8.8 8.8 8.0 5.5
    Hombre Mañana B N 6.1 6.8 4.0 3.5 2.2
    Hombre Mañana A N 6.2 9.0 5.0 4.4 3.7
    Hombre Mañana A S 8.6 8.9 9.5 8.4 3.9
    Mujer Mañana A N 6.7 7.9 5.6 4.8 4.2
    Mujer Tarde C S 4.1 5.2 1.7 0.3 1.0
    Hombre Tarde C N 5.0 5.0 3.3 2.7 6.0
    Hombre Tarde C N 5.3 6.3 4.8 3.6 2.3
    Mujer Mañana A N 7.8 NA 6.5 6.7 2.8
    Hombre Mañana A N 6.5 8.0 5.0 3.2 3.3
    Hombre Mañana B N 6.6 7.6 5.3 4.0 1.0
    Hombre Mañana B N 6.2 6.7 5.3 4.7 4.7
    Hombre Mañana B N 5.2 4.1 5.8 5.0 1.9
    Hombre Mañana B S 8.7 NA 7.6 6.3 9.3
    Mujer Mañana B N 6.7 6.3 6.8 5.3 2.8
    Mujer Tarde C N 3.1 4.8 2.7 1.8 1.0
    Hombre Mañana B N 7.1 10.0 5.9 4.9 2.5
    Hombre Mañana B S 5.3 4.8 2.8 0.9 4.2
    Hombre Mañana A N 4.4 6.1 2.9 1.9 2.4
    Mujer Tarde C S 5.7 6.4 4.2 3.3 1.0
    Mujer Tarde C S 4.5 3.9 3.5 2.6 2.2
    Mujer Tarde C N 4.9 4.4 5.2 3.7 0.4
    Hombre Tarde C N 5.1 4.5 6.4 5.6 0.5
    Hombre Mañana B N 3.5 3.9 4.0 3.7 1.7
    Mujer Mañana A N 7.3 6.8 6.1 5.4 1.8
    Hombre Mañana B N 6.2 7.9 3.5 1.9 3.1
    Mujer Mañana A N 4.3 7.4 2.9 1.7 0.2
    Hombre Mañana B N 7.9 7.6 7.0 6.1 0.4
    Hombre Mañana B N 6.6 8.4 6.5 5.2 3.9
    Hombre Mañana A N 5.6 7.3 5.5 3.4 5.0
    Mujer Mañana B N 7.3 8.7 7.0 6.5 2.8
    Mujer Mañana B N 7.3 7.3 4.9 3.5 1.0
    Hombre Mañana A N 7.2 8.1 7.1 5.8 1.3
    Hombre Mañana A S 7.0 7.8 5.6 5.3 1.2
    Hombre Mañana B N 6.8 8.4 6.0 4.6 1.0
    Mujer Mañana A N 5.9 6.5 5.0 4.4 4.1
    Hombre Tarde C S 5.5 7.5 5.0 3.3 4.1
    Mujer Tarde C N 5.4 6.1 4.5 3.3 0.3
    Mujer Tarde C S 5.0 7.0 2.3 1.3 3.6
    Mujer Tarde C S 5.7 5.6 5.4 3.8 2.7
    Hombre Tarde C N 4.1 3.8 3.5 2.2 0.7
    Mujer Mañana B S 9.3 NA 8.0 7.0 0.7
    Mujer Mañana B N 7.8 8.4 6.9 6.3 2.2
    Hombre Tarde C N 4.3 5.6 3.4 1.6 6.2
    Hombre Tarde C N 5.4 7.0 4.6 3.4 2.9
    Hombre Mañana A N 5.3 5.8 5.9 5.3 4.3
    Hombre Mañana B N 7.2 8.7 6.0 4.7 1.5
    Mujer Tarde C S 5.9 7.2 5.0 4.2 1.6
    Hombre Mañana A N 6.4 7.2 6.5 5.8 2.4
    Hombre Mañana B S 6.0 7.0 6.0 5.1 0.6
    Hombre Tarde C N 5.9 6.9 6.1 5.4 0.4
    Hombre Mañana B N 8.1 NA 6.5 5.4 2.4
    Hombre Tarde C N 5.7 5.9 6.7 5.5 2.3
    Mujer Mañana A N 8.3 8.2 7.3 5.0 4.2
    Mujer Tarde C S 3.7 4.7 4.5 3.5 2.4
    Hombre Mañana A S 6.9 8.2 4.5 3.7 3.6
    Mujer Mañana B N 6.2 7.6 5.2 4.5 1.0
    Mujer Mañana B N 6.3 6.9 6.6 5.3 4.4
    Hombre Mañana A N 6.6 6.5 4.9 4.7 5.5
    Hombre Tarde C S 5.2 7.5 3.5 2.6 0.4
    Hombre Tarde C N 5.5 6.2 3.6 2.6 3.6
    Hombre Tarde C N 4.5 4.6 2.4 2.1 2.1
    Mujer Tarde C N 4.4 5.2 3.0 1.6 0.1
    Hombre Mañana B N 6.5 7.3 5.8 4.6 0.7
    Mujer Mañana A N 6.7 8.8 3.7 3.9 1.8
    Hombre Mañana B N 6.1 7.2 5.3 4.3 2.0
    Hombre Mañana A S 7.4 9.1 7.6 7.4 2.8
    Mujer Mañana B N 9.1 9.6 NA NA 0.7
    Mujer Tarde C S 5.3 6.5 5.6 4.5 1.5
    Mujer Tarde C N 2.5 3.2 2.3 1.5 6.2
    Mujer Mañana A S 7.5 8.6 4.8 3.9 3.9
    Hombre Tarde C S 4.9 5.0 3.3 1.8 2.5
    Mujer Mañana A N 5.0 4.7 3.6 2.6 2.3
    Mujer Mañana B N 7.5 NA 7.2 5.7 3.7
    Mujer Tarde C S 5.6 7.2 4.5 3.8 0.7
    Mujer Tarde C N 4.2 3.9 1.9 1.5 7.4
    Hombre Mañana B N 6.3 6.7 7.0 4.8 4.7
    Mujer Tarde C S 5.8 5.6 5.7 5.3 1.9
    Mujer Mañana A S 6.0 9.2 5.2 3.6 9.2
    Hombre Mañana A N 6.6 8.9 6.8 6.0 0.5
    Mujer Tarde C N 5.4 6.2 3.1 2.4 1.6
    Hombre Mañana A N 7.0 8.5 6.6 5.5 2.0
    Hombre Tarde C S 5.7 6.3 4.1 2.8 4.2
    Hombre Mañana A N 6.5 7.0 6.2 5.3 4.1
    Hombre Mañana B N 7.6 7.9 6.6 5.8 6.5
    Hombre Mañana A S 6.7 7.1 6.3 5.7 2.1
    Mujer Tarde C N 5.5 8.2 5.8 3.8 5.1
    Hombre Mañana A N 7.7 8.7 6.7 4.9 NA
    Mujer Mañana A N 7.5 8.6 7.5 7.2 0.9
    Mujer Mañana A N 6.8 8.1 4.6 4.2 3.2
    Hombre Mañana A N 6.4 8.6 4.6 3.9 1.1
    Hombre Tarde C N 5.1 5.5 5.6 4.9 2.7
    Mujer Mañana A N 8.0 8.0 7.4 6.9 4.1
    Mujer Mañana A S 5.1 7.8 2.0 NA 2.4
    Hombre Mañana B N 9.3 9.8 6.9 6.5 0.6
    Hombre Mañana B N 8.3 8.6 7.1 5.9 2.1
    Hombre Mañana A N 5.6 5.4 5.5 4.6 4.8
    Hombre Tarde C N 4.5 4.2 3.4 2.2 2.3
    Hombre Tarde C S 4.9 5.4 4.6 4.0 2.3
    Mujer Mañana A S 6.4 8.0 6.3 5.2 2.7
    Hombre Tarde C S 5.6 7.7 6.3 5.6 1.5
    Hombre Mañana A N 5.5 7.2 4.5 3.3 2.6
    Hombre Tarde C N 4.6 5.2 3.5 2.0 2.3
    Hombre Mañana B N 5.9 7.0 3.2 2.8 3.5
    Mujer Tarde C N 4.8 5.1 3.9 3.3 1.3
    Mujer Tarde C S 3.5 3.8 1.9 1.8 2.1
    Mujer Tarde C N 5.4 7.3 3.5 2.5 4.6
    Hombre Mañana B N 7.4 7.4 6.2 5.8 1.1
    Mujer Tarde C S 5.1 8.1 5.2 5.1 4.5
    Hombre Mañana A N 6.9 7.8 3.9 2.8 NA
    Hombre Tarde C N 3.6 4.8 2.1 0.5 5.6
    Hombre Tarde C S 5.9 6.2 5.0 3.9 1.9
    Hombre Mañana B N 6.8 7.2 4.9 3.8 2.8
    Hombre Mañana A N 6.5 6.1 5.8 4.9 1.2
    Mujer Mañana B N 6.2 7.0 5.6 5.4 1.7
    Mujer Tarde C N 5.0 6.5 4.0 2.8 3.6
    Hombre Tarde C N 4.7 6.0 1.3 0.4 2.2
    Hombre Tarde C S 4.5 4.7 6.0 4.9 1.8
    Crear un data frame con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/notas-curso2.csv.
  2. Convertir el data frame a formato largo.

    Para convertir un data frame a formato largo podemos usar la siguiente función del paquete tidyr de tidyverse:

    • pivot_longer(df, columnas, names_to = columna_nombres, values_to = columna_valores). Devuelve un data frame con los datos de la columna indicada en columnas en formato largo. Indicar las columnas que contienen las notas de las asignaturas en columnas. Indicar el nombre de la nueva columna que contendrá los nombres de las asignaturas en columna_nombres y el nombre de la nueva columna que contendrá las notas en columna_valores.
    df_largo <- df |> pivot_longer(notaA:notaE, names_to = "Asignatura", values_to = "Nota")
    df_largo
    sexo turno grupo trabaja Asignatura Nota
    Mujer Tarde C N notaA 5.2
    Mujer Tarde C N notaB 6.3
    Mujer Tarde C N notaC 3.4
    Mujer Tarde C N notaD 2.3
    Mujer Tarde C N notaE 2.0
    Hombre Mañana A N notaA 5.7
    Hombre Mañana A N notaB 5.7
    Hombre Mañana A N notaC 4.2
    Hombre Mañana A N notaD 3.5
    Hombre Mañana A N notaE 2.7
    Hombre Mañana B N notaA 8.3
    Hombre Mañana B N notaB 8.8
    Hombre Mañana B N notaC 8.8
    Hombre Mañana B N notaD 8.0
    Hombre Mañana B N notaE 5.5
    Hombre Mañana B N notaA 6.1
    Hombre Mañana B N notaB 6.8
    Hombre Mañana B N notaC 4.0
    Hombre Mañana B N notaD 3.5
    Hombre Mañana B N notaE 2.2
    Hombre Mañana A N notaA 6.2
    Hombre Mañana A N notaB 9.0
    Hombre Mañana A N notaC 5.0
    Hombre Mañana A N notaD 4.4
    Hombre Mañana A N notaE 3.7
    Hombre Mañana A S notaA 8.6
    Hombre Mañana A S notaB 8.9
    Hombre Mañana A S notaC 9.5
    Hombre Mañana A S notaD 8.4
    Hombre Mañana A S notaE 3.9
    Mujer Mañana A N notaA 6.7
    Mujer Mañana A N notaB 7.9
    Mujer Mañana A N notaC 5.6
    Mujer Mañana A N notaD 4.8
    Mujer Mañana A N notaE 4.2
    Mujer Tarde C S notaA 4.1
    Mujer Tarde C S notaB 5.2
    Mujer Tarde C S notaC 1.7
    Mujer Tarde C S notaD 0.3
    Mujer Tarde C S notaE 1.0
    Hombre Tarde C N notaA 5.0
    Hombre Tarde C N notaB 5.0
    Hombre Tarde C N notaC 3.3
    Hombre Tarde C N notaD 2.7
    Hombre Tarde C N notaE 6.0
    Hombre Tarde C N notaA 5.3
    Hombre Tarde C N notaB 6.3
    Hombre Tarde C N notaC 4.8
    Hombre Tarde C N notaD 3.6
    Hombre Tarde C N notaE 2.3
    Mujer Mañana A N notaA 7.8
    Mujer Mañana A N notaB NA
    Mujer Mañana A N notaC 6.5
    Mujer Mañana A N notaD 6.7
    Mujer Mañana A N notaE 2.8
    Hombre Mañana A N notaA 6.5
    Hombre Mañana A N notaB 8.0
    Hombre Mañana A N notaC 5.0
    Hombre Mañana A N notaD 3.2
    Hombre Mañana A N notaE 3.3
    Hombre Mañana B N notaA 6.6
    Hombre Mañana B N notaB 7.6
    Hombre Mañana B N notaC 5.3
    Hombre Mañana B N notaD 4.0
    Hombre Mañana B N notaE 1.0
    Hombre Mañana B N notaA 6.2
    Hombre Mañana B N notaB 6.7
    Hombre Mañana B N notaC 5.3
    Hombre Mañana B N notaD 4.7
    Hombre Mañana B N notaE 4.7
    Hombre Mañana B N notaA 5.2
    Hombre Mañana B N notaB 4.1
    Hombre Mañana B N notaC 5.8
    Hombre Mañana B N notaD 5.0
    Hombre Mañana B N notaE 1.9
    Hombre Mañana B S notaA 8.7
    Hombre Mañana B S notaB NA
    Hombre Mañana B S notaC 7.6
    Hombre Mañana B S notaD 6.3
    Hombre Mañana B S notaE 9.3
    Mujer Mañana B N notaA 6.7
    Mujer Mañana B N notaB 6.3
    Mujer Mañana B N notaC 6.8
    Mujer Mañana B N notaD 5.3
    Mujer Mañana B N notaE 2.8
    Mujer Tarde C N notaA 3.1
    Mujer Tarde C N notaB 4.8
    Mujer Tarde C N notaC 2.7
    Mujer Tarde C N notaD 1.8
    Mujer Tarde C N notaE 1.0
    Hombre Mañana B N notaA 7.1
    Hombre Mañana B N notaB 10.0
    Hombre Mañana B N notaC 5.9
    Hombre Mañana B N notaD 4.9
    Hombre Mañana B N notaE 2.5
    Hombre Mañana B S notaA 5.3
    Hombre Mañana B S notaB 4.8
    Hombre Mañana B S notaC 2.8
    Hombre Mañana B S notaD 0.9
    Hombre Mañana B S notaE 4.2
    Hombre Mañana A N notaA 4.4
    Hombre Mañana A N notaB 6.1
    Hombre Mañana A N notaC 2.9
    Hombre Mañana A N notaD 1.9
    Hombre Mañana A N notaE 2.4
    Mujer Tarde C S notaA 5.7
    Mujer Tarde C S notaB 6.4
    Mujer Tarde C S notaC 4.2
    Mujer Tarde C S notaD 3.3
    Mujer Tarde C S notaE 1.0
    Mujer Tarde C S notaA 4.5
    Mujer Tarde C S notaB 3.9
    Mujer Tarde C S notaC 3.5
    Mujer Tarde C S notaD 2.6
    Mujer Tarde C S notaE 2.2
    Mujer Tarde C N notaA 4.9
    Mujer Tarde C N notaB 4.4
    Mujer Tarde C N notaC 5.2
    Mujer Tarde C N notaD 3.7
    Mujer Tarde C N notaE 0.4
    Hombre Tarde C N notaA 5.1
    Hombre Tarde C N notaB 4.5
    Hombre Tarde C N notaC 6.4
    Hombre Tarde C N notaD 5.6
    Hombre Tarde C N notaE 0.5
    Hombre Mañana B N notaA 3.5
    Hombre Mañana B N notaB 3.9
    Hombre Mañana B N notaC 4.0
    Hombre Mañana B N notaD 3.7
    Hombre Mañana B N notaE 1.7
    Mujer Mañana A N notaA 7.3
    Mujer Mañana A N notaB 6.8
    Mujer Mañana A N notaC 6.1
    Mujer Mañana A N notaD 5.4
    Mujer Mañana A N notaE 1.8
    Hombre Mañana B N notaA 6.2
    Hombre Mañana B N notaB 7.9
    Hombre Mañana B N notaC 3.5
    Hombre Mañana B N notaD 1.9
    Hombre Mañana B N notaE 3.1
    Mujer Mañana A N notaA 4.3
    Mujer Mañana A N notaB 7.4
    Mujer Mañana A N notaC 2.9
    Mujer Mañana A N notaD 1.7
    Mujer Mañana A N notaE 0.2
    Hombre Mañana B N notaA 7.9
    Hombre Mañana B N notaB 7.6
    Hombre Mañana B N notaC 7.0
    Hombre Mañana B N notaD 6.1
    Hombre Mañana B N notaE 0.4
    Hombre Mañana B N notaA 6.6
    Hombre Mañana B N notaB 8.4
    Hombre Mañana B N notaC 6.5
    Hombre Mañana B N notaD 5.2
    Hombre Mañana B N notaE 3.9
    Hombre Mañana A N notaA 5.6
    Hombre Mañana A N notaB 7.3
    Hombre Mañana A N notaC 5.5
    Hombre Mañana A N notaD 3.4
    Hombre Mañana A N notaE 5.0
    Mujer Mañana B N notaA 7.3
    Mujer Mañana B N notaB 8.7
    Mujer Mañana B N notaC 7.0
    Mujer Mañana B N notaD 6.5
    Mujer Mañana B N notaE 2.8
    Mujer Mañana B N notaA 7.3
    Mujer Mañana B N notaB 7.3
    Mujer Mañana B N notaC 4.9
    Mujer Mañana B N notaD 3.5
    Mujer Mañana B N notaE 1.0
    Hombre Mañana A N notaA 7.2
    Hombre Mañana A N notaB 8.1
    Hombre Mañana A N notaC 7.1
    Hombre Mañana A N notaD 5.8
    Hombre Mañana A N notaE 1.3
    Hombre Mañana A S notaA 7.0
    Hombre Mañana A S notaB 7.8
    Hombre Mañana A S notaC 5.6
    Hombre Mañana A S notaD 5.3
    Hombre Mañana A S notaE 1.2
    Hombre Mañana B N notaA 6.8
    Hombre Mañana B N notaB 8.4
    Hombre Mañana B N notaC 6.0
    Hombre Mañana B N notaD 4.6
    Hombre Mañana B N notaE 1.0
    Mujer Mañana A N notaA 5.9
    Mujer Mañana A N notaB 6.5
    Mujer Mañana A N notaC 5.0
    Mujer Mañana A N notaD 4.4
    Mujer Mañana A N notaE 4.1
    Hombre Tarde C S notaA 5.5
    Hombre Tarde C S notaB 7.5
    Hombre Tarde C S notaC 5.0
    Hombre Tarde C S notaD 3.3
    Hombre Tarde C S notaE 4.1
    Mujer Tarde C N notaA 5.4
    Mujer Tarde C N notaB 6.1
    Mujer Tarde C N notaC 4.5
    Mujer Tarde C N notaD 3.3
    Mujer Tarde C N notaE 0.3
    Mujer Tarde C S notaA 5.0
    Mujer Tarde C S notaB 7.0
    Mujer Tarde C S notaC 2.3
    Mujer Tarde C S notaD 1.3
    Mujer Tarde C S notaE 3.6
    Mujer Tarde C S notaA 5.7
    Mujer Tarde C S notaB 5.6
    Mujer Tarde C S notaC 5.4
    Mujer Tarde C S notaD 3.8
    Mujer Tarde C S notaE 2.7
    Hombre Tarde C N notaA 4.1
    Hombre Tarde C N notaB 3.8
    Hombre Tarde C N notaC 3.5
    Hombre Tarde C N notaD 2.2
    Hombre Tarde C N notaE 0.7
    Mujer Mañana B S notaA 9.3
    Mujer Mañana B S notaB NA
    Mujer Mañana B S notaC 8.0
    Mujer Mañana B S notaD 7.0
    Mujer Mañana B S notaE 0.7
    Mujer Mañana B N notaA 7.8
    Mujer Mañana B N notaB 8.4
    Mujer Mañana B N notaC 6.9
    Mujer Mañana B N notaD 6.3
    Mujer Mañana B N notaE 2.2
    Hombre Tarde C N notaA 4.3
    Hombre Tarde C N notaB 5.6
    Hombre Tarde C N notaC 3.4
    Hombre Tarde C N notaD 1.6
    Hombre Tarde C N notaE 6.2
    Hombre Tarde C N notaA 5.4
    Hombre Tarde C N notaB 7.0
    Hombre Tarde C N notaC 4.6
    Hombre Tarde C N notaD 3.4
    Hombre Tarde C N notaE 2.9
    Hombre Mañana A N notaA 5.3
    Hombre Mañana A N notaB 5.8
    Hombre Mañana A N notaC 5.9
    Hombre Mañana A N notaD 5.3
    Hombre Mañana A N notaE 4.3
    Hombre Mañana B N notaA 7.2
    Hombre Mañana B N notaB 8.7
    Hombre Mañana B N notaC 6.0
    Hombre Mañana B N notaD 4.7
    Hombre Mañana B N notaE 1.5
    Mujer Tarde C S notaA 5.9
    Mujer Tarde C S notaB 7.2
    Mujer Tarde C S notaC 5.0
    Mujer Tarde C S notaD 4.2
    Mujer Tarde C S notaE 1.6
    Hombre Mañana A N notaA 6.4
    Hombre Mañana A N notaB 7.2
    Hombre Mañana A N notaC 6.5
    Hombre Mañana A N notaD 5.8
    Hombre Mañana A N notaE 2.4
    Hombre Mañana B S notaA 6.0
    Hombre Mañana B S notaB 7.0
    Hombre Mañana B S notaC 6.0
    Hombre Mañana B S notaD 5.1
    Hombre Mañana B S notaE 0.6
    Hombre Tarde C N notaA 5.9
    Hombre Tarde C N notaB 6.9
    Hombre Tarde C N notaC 6.1
    Hombre Tarde C N notaD 5.4
    Hombre Tarde C N notaE 0.4
    Hombre Mañana B N notaA 8.1
    Hombre Mañana B N notaB NA
    Hombre Mañana B N notaC 6.5
    Hombre Mañana B N notaD 5.4
    Hombre Mañana B N notaE 2.4
    Hombre Tarde C N notaA 5.7
    Hombre Tarde C N notaB 5.9
    Hombre Tarde C N notaC 6.7
    Hombre Tarde C N notaD 5.5
    Hombre Tarde C N notaE 2.3
    Mujer Mañana A N notaA 8.3
    Mujer Mañana A N notaB 8.2
    Mujer Mañana A N notaC 7.3
    Mujer Mañana A N notaD 5.0
    Mujer Mañana A N notaE 4.2
    Mujer Tarde C S notaA 3.7
    Mujer Tarde C S notaB 4.7
    Mujer Tarde C S notaC 4.5
    Mujer Tarde C S notaD 3.5
    Mujer Tarde C S notaE 2.4
    Hombre Mañana A S notaA 6.9
    Hombre Mañana A S notaB 8.2
    Hombre Mañana A S notaC 4.5
    Hombre Mañana A S notaD 3.7
    Hombre Mañana A S notaE 3.6
    Mujer Mañana B N notaA 6.2
    Mujer Mañana B N notaB 7.6
    Mujer Mañana B N notaC 5.2
    Mujer Mañana B N notaD 4.5
    Mujer Mañana B N notaE 1.0
    Mujer Mañana B N notaA 6.3
    Mujer Mañana B N notaB 6.9
    Mujer Mañana B N notaC 6.6
    Mujer Mañana B N notaD 5.3
    Mujer Mañana B N notaE 4.4
    Hombre Mañana A N notaA 6.6
    Hombre Mañana A N notaB 6.5
    Hombre Mañana A N notaC 4.9
    Hombre Mañana A N notaD 4.7
    Hombre Mañana A N notaE 5.5
    Hombre Tarde C S notaA 5.2
    Hombre Tarde C S notaB 7.5
    Hombre Tarde C S notaC 3.5
    Hombre Tarde C S notaD 2.6
    Hombre Tarde C S notaE 0.4
    Hombre Tarde C N notaA 5.5
    Hombre Tarde C N notaB 6.2
    Hombre Tarde C N notaC 3.6
    Hombre Tarde C N notaD 2.6
    Hombre Tarde C N notaE 3.6
    Hombre Tarde C N notaA 4.5
    Hombre Tarde C N notaB 4.6
    Hombre Tarde C N notaC 2.4
    Hombre Tarde C N notaD 2.1
    Hombre Tarde C N notaE 2.1
    Mujer Tarde C N notaA 4.4
    Mujer Tarde C N notaB 5.2
    Mujer Tarde C N notaC 3.0
    Mujer Tarde C N notaD 1.6
    Mujer Tarde C N notaE 0.1
    Hombre Mañana B N notaA 6.5
    Hombre Mañana B N notaB 7.3
    Hombre Mañana B N notaC 5.8
    Hombre Mañana B N notaD 4.6
    Hombre Mañana B N notaE 0.7
    Mujer Mañana A N notaA 6.7
    Mujer Mañana A N notaB 8.8
    Mujer Mañana A N notaC 3.7
    Mujer Mañana A N notaD 3.9
    Mujer Mañana A N notaE 1.8
    Hombre Mañana B N notaA 6.1
    Hombre Mañana B N notaB 7.2
    Hombre Mañana B N notaC 5.3
    Hombre Mañana B N notaD 4.3
    Hombre Mañana B N notaE 2.0
    Hombre Mañana A S notaA 7.4
    Hombre Mañana A S notaB 9.1
    Hombre Mañana A S notaC 7.6
    Hombre Mañana A S notaD 7.4
    Hombre Mañana A S notaE 2.8
    Mujer Mañana B N notaA 9.1
    Mujer Mañana B N notaB 9.6
    Mujer Mañana B N notaC NA
    Mujer Mañana B N notaD NA
    Mujer Mañana B N notaE 0.7
    Mujer Tarde C S notaA 5.3
    Mujer Tarde C S notaB 6.5
    Mujer Tarde C S notaC 5.6
    Mujer Tarde C S notaD 4.5
    Mujer Tarde C S notaE 1.5
    Mujer Tarde C N notaA 2.5
    Mujer Tarde C N notaB 3.2
    Mujer Tarde C N notaC 2.3
    Mujer Tarde C N notaD 1.5
    Mujer Tarde C N notaE 6.2
    Mujer Mañana A S notaA 7.5
    Mujer Mañana A S notaB 8.6
    Mujer Mañana A S notaC 4.8
    Mujer Mañana A S notaD 3.9
    Mujer Mañana A S notaE 3.9
    Hombre Tarde C S notaA 4.9
    Hombre Tarde C S notaB 5.0
    Hombre Tarde C S notaC 3.3
    Hombre Tarde C S notaD 1.8
    Hombre Tarde C S notaE 2.5
    Mujer Mañana A N notaA 5.0
    Mujer Mañana A N notaB 4.7
    Mujer Mañana A N notaC 3.6
    Mujer Mañana A N notaD 2.6
    Mujer Mañana A N notaE 2.3
    Mujer Mañana B N notaA 7.5
    Mujer Mañana B N notaB NA
    Mujer Mañana B N notaC 7.2
    Mujer Mañana B N notaD 5.7
    Mujer Mañana B N notaE 3.7
    Mujer Tarde C S notaA 5.6
    Mujer Tarde C S notaB 7.2
    Mujer Tarde C S notaC 4.5
    Mujer Tarde C S notaD 3.8
    Mujer Tarde C S notaE 0.7
    Mujer Tarde C N notaA 4.2
    Mujer Tarde C N notaB 3.9
    Mujer Tarde C N notaC 1.9
    Mujer Tarde C N notaD 1.5
    Mujer Tarde C N notaE 7.4
    Hombre Mañana B N notaA 6.3
    Hombre Mañana B N notaB 6.7
    Hombre Mañana B N notaC 7.0
    Hombre Mañana B N notaD 4.8
    Hombre Mañana B N notaE 4.7
    Mujer Tarde C S notaA 5.8
    Mujer Tarde C S notaB 5.6
    Mujer Tarde C S notaC 5.7
    Mujer Tarde C S notaD 5.3
    Mujer Tarde C S notaE 1.9
    Mujer Mañana A S notaA 6.0
    Mujer Mañana A S notaB 9.2
    Mujer Mañana A S notaC 5.2
    Mujer Mañana A S notaD 3.6
    Mujer Mañana A S notaE 9.2
    Hombre Mañana A N notaA 6.6
    Hombre Mañana A N notaB 8.9
    Hombre Mañana A N notaC 6.8
    Hombre Mañana A N notaD 6.0
    Hombre Mañana A N notaE 0.5
    Mujer Tarde C N notaA 5.4
    Mujer Tarde C N notaB 6.2
    Mujer Tarde C N notaC 3.1
    Mujer Tarde C N notaD 2.4
    Mujer Tarde C N notaE 1.6
    Hombre Mañana A N notaA 7.0
    Hombre Mañana A N notaB 8.5
    Hombre Mañana A N notaC 6.6
    Hombre Mañana A N notaD 5.5
    Hombre Mañana A N notaE 2.0
    Hombre Tarde C S notaA 5.7
    Hombre Tarde C S notaB 6.3
    Hombre Tarde C S notaC 4.1
    Hombre Tarde C S notaD 2.8
    Hombre Tarde C S notaE 4.2
    Hombre Mañana A N notaA 6.5
    Hombre Mañana A N notaB 7.0
    Hombre Mañana A N notaC 6.2
    Hombre Mañana A N notaD 5.3
    Hombre Mañana A N notaE 4.1
    Hombre Mañana B N notaA 7.6
    Hombre Mañana B N notaB 7.9
    Hombre Mañana B N notaC 6.6
    Hombre Mañana B N notaD 5.8
    Hombre Mañana B N notaE 6.5
    Hombre Mañana A S notaA 6.7
    Hombre Mañana A S notaB 7.1
    Hombre Mañana A S notaC 6.3
    Hombre Mañana A S notaD 5.7
    Hombre Mañana A S notaE 2.1
    Mujer Tarde C N notaA 5.5
    Mujer Tarde C N notaB 8.2
    Mujer Tarde C N notaC 5.8
    Mujer Tarde C N notaD 3.8
    Mujer Tarde C N notaE 5.1
    Hombre Mañana A N notaA 7.7
    Hombre Mañana A N notaB 8.7
    Hombre Mañana A N notaC 6.7
    Hombre Mañana A N notaD 4.9
    Hombre Mañana A N notaE NA
    Mujer Mañana A N notaA 7.5
    Mujer Mañana A N notaB 8.6
    Mujer Mañana A N notaC 7.5
    Mujer Mañana A N notaD 7.2
    Mujer Mañana A N notaE 0.9
    Mujer Mañana A N notaA 6.8
    Mujer Mañana A N notaB 8.1
    Mujer Mañana A N notaC 4.6
    Mujer Mañana A N notaD 4.2
    Mujer Mañana A N notaE 3.2
    Hombre Mañana A N notaA 6.4
    Hombre Mañana A N notaB 8.6
    Hombre Mañana A N notaC 4.6
    Hombre Mañana A N notaD 3.9
    Hombre Mañana A N notaE 1.1
    Hombre Tarde C N notaA 5.1
    Hombre Tarde C N notaB 5.5
    Hombre Tarde C N notaC 5.6
    Hombre Tarde C N notaD 4.9
    Hombre Tarde C N notaE 2.7
    Mujer Mañana A N notaA 8.0
    Mujer Mañana A N notaB 8.0
    Mujer Mañana A N notaC 7.4
    Mujer Mañana A N notaD 6.9
    Mujer Mañana A N notaE 4.1
    Mujer Mañana A S notaA 5.1
    Mujer Mañana A S notaB 7.8
    Mujer Mañana A S notaC 2.0
    Mujer Mañana A S notaD NA
    Mujer Mañana A S notaE 2.4
    Hombre Mañana B N notaA 9.3
    Hombre Mañana B N notaB 9.8
    Hombre Mañana B N notaC 6.9
    Hombre Mañana B N notaD 6.5
    Hombre Mañana B N notaE 0.6
    Hombre Mañana B N notaA 8.3
    Hombre Mañana B N notaB 8.6
    Hombre Mañana B N notaC 7.1
    Hombre Mañana B N notaD 5.9
    Hombre Mañana B N notaE 2.1
    Hombre Mañana A N notaA 5.6
    Hombre Mañana A N notaB 5.4
    Hombre Mañana A N notaC 5.5
    Hombre Mañana A N notaD 4.6
    Hombre Mañana A N notaE 4.8
    Hombre Tarde C N notaA 4.5
    Hombre Tarde C N notaB 4.2
    Hombre Tarde C N notaC 3.4
    Hombre Tarde C N notaD 2.2
    Hombre Tarde C N notaE 2.3
    Hombre Tarde C S notaA 4.9
    Hombre Tarde C S notaB 5.4
    Hombre Tarde C S notaC 4.6
    Hombre Tarde C S notaD 4.0
    Hombre Tarde C S notaE 2.3
    Mujer Mañana A S notaA 6.4
    Mujer Mañana A S notaB 8.0
    Mujer Mañana A S notaC 6.3
    Mujer Mañana A S notaD 5.2
    Mujer Mañana A S notaE 2.7
    Hombre Tarde C S notaA 5.6
    Hombre Tarde C S notaB 7.7
    Hombre Tarde C S notaC 6.3
    Hombre Tarde C S notaD 5.6
    Hombre Tarde C S notaE 1.5
    Hombre Mañana A N notaA 5.5
    Hombre Mañana A N notaB 7.2
    Hombre Mañana A N notaC 4.5
    Hombre Mañana A N notaD 3.3
    Hombre Mañana A N notaE 2.6
    Hombre Tarde C N notaA 4.6
    Hombre Tarde C N notaB 5.2
    Hombre Tarde C N notaC 3.5
    Hombre Tarde C N notaD 2.0
    Hombre Tarde C N notaE 2.3
    Hombre Mañana B N notaA 5.9
    Hombre Mañana B N notaB 7.0
    Hombre Mañana B N notaC 3.2
    Hombre Mañana B N notaD 2.8
    Hombre Mañana B N notaE 3.5
    Mujer Tarde C N notaA 4.8
    Mujer Tarde C N notaB 5.1
    Mujer Tarde C N notaC 3.9
    Mujer Tarde C N notaD 3.3
    Mujer Tarde C N notaE 1.3
    Mujer Tarde C S notaA 3.5
    Mujer Tarde C S notaB 3.8
    Mujer Tarde C S notaC 1.9
    Mujer Tarde C S notaD 1.8
    Mujer Tarde C S notaE 2.1
    Mujer Tarde C N notaA 5.4
    Mujer Tarde C N notaB 7.3
    Mujer Tarde C N notaC 3.5
    Mujer Tarde C N notaD 2.5
    Mujer Tarde C N notaE 4.6
    Hombre Mañana B N notaA 7.4
    Hombre Mañana B N notaB 7.4
    Hombre Mañana B N notaC 6.2
    Hombre Mañana B N notaD 5.8
    Hombre Mañana B N notaE 1.1
    Mujer Tarde C S notaA 5.1
    Mujer Tarde C S notaB 8.1
    Mujer Tarde C S notaC 5.2
    Mujer Tarde C S notaD 5.1
    Mujer Tarde C S notaE 4.5
    Hombre Mañana A N notaA 6.9
    Hombre Mañana A N notaB 7.8
    Hombre Mañana A N notaC 3.9
    Hombre Mañana A N notaD 2.8
    Hombre Mañana A N notaE NA
    Hombre Tarde C N notaA 3.6
    Hombre Tarde C N notaB 4.8
    Hombre Tarde C N notaC 2.1
    Hombre Tarde C N notaD 0.5
    Hombre Tarde C N notaE 5.6
    Hombre Tarde C S notaA 5.9
    Hombre Tarde C S notaB 6.2
    Hombre Tarde C S notaC 5.0
    Hombre Tarde C S notaD 3.9
    Hombre Tarde C S notaE 1.9
    Hombre Mañana B N notaA 6.8
    Hombre Mañana B N notaB 7.2
    Hombre Mañana B N notaC 4.9
    Hombre Mañana B N notaD 3.8
    Hombre Mañana B N notaE 2.8
    Hombre Mañana A N notaA 6.5
    Hombre Mañana A N notaB 6.1
    Hombre Mañana A N notaC 5.8
    Hombre Mañana A N notaD 4.9
    Hombre Mañana A N notaE 1.2
    Mujer Mañana B N notaA 6.2
    Mujer Mañana B N notaB 7.0
    Mujer Mañana B N notaC 5.6
    Mujer Mañana B N notaD 5.4
    Mujer Mañana B N notaE 1.7
    Mujer Tarde C N notaA 5.0
    Mujer Tarde C N notaB 6.5
    Mujer Tarde C N notaC 4.0
    Mujer Tarde C N notaD 2.8
    Mujer Tarde C N notaE 3.6
    Hombre Tarde C N notaA 4.7
    Hombre Tarde C N notaB 6.0
    Hombre Tarde C N notaC 1.3
    Hombre Tarde C N notaD 0.4
    Hombre Tarde C N notaE 2.2
    Hombre Tarde C S notaA 4.5
    Hombre Tarde C S notaB 4.7
    Hombre Tarde C S notaC 6.0
    Hombre Tarde C S notaD 4.9
    Hombre Tarde C S notaE 1.8
    Convertir el data frame a formato largo usando la función pivot_longer. Pivotar las columnas cuyo nombre comienza por nota y llamar Asignatura a la columna con los nombres de las columnas pivotadas, y Nota a la columna con sus valores.
  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")))
    head(df_largo)
    sexo turno grupo trabaja Asignatura Nota Califiación
    Mujer Tarde C N notaA 5.2 AP
    Mujer Tarde C N notaB 6.3 AP
    Mujer Tarde C N notaC 3.4 SS
    Mujer Tarde C N notaD 2.3 SS
    Mujer Tarde C N notaE 2.0 SS
    Hombre Mañana A N notaA 5.7 AP
    Usar la función cut para crear una nueva columna de nombre Calificación que categorice las notas según los siguientes intervalos:
    - SS: Nota menor de 5
    - AP: Nota de 5 a 6.9
    - NT: Nota de 7 a 8.9
    - SB: Nota de 9 a 10
  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))
    Asignatura Nota
    notaB 9.2
    notaE 9.2
    notaB 8.8
    notaB 8.6
    notaB 8.6
    notaA 8.3
    notaB 8.2
    notaB 8.1
    notaA 8.0
    notaB 8.0
    notaB 8.0
    notaB 7.9
    notaA 7.8
    notaB 7.8
    notaA 7.5
    notaA 7.5
    notaC 7.5
    notaB 7.4
    notaC 7.4
    notaA 7.3
    notaC 7.3
    notaD 7.2
    notaD 6.9
    notaB 6.8
    notaA 6.8
    notaA 6.7
    notaD 6.7
    notaA 6.7
    notaC 6.5
    notaB 6.5
    notaA 6.4
    notaC 6.3
    notaC 6.1
    notaA 6.0
    notaA 5.9
    notaC 5.6
    notaD 5.4
    notaC 5.2
    notaD 5.2
    notaA 5.1
    notaC 5.0
    notaD 5.0
    notaA 5.0
    notaD 4.8
    notaC 4.8
    notaB 4.7
    notaC 4.6
    notaD 4.4
    notaA 4.3
    notaE 4.2
    notaE 4.2
    notaD 4.2
    notaE 4.1
    notaE 4.1
    notaD 3.9
    notaD 3.9
    notaE 3.9
    notaC 3.7
    notaC 3.6
    notaD 3.6
    notaE 3.2
    notaC 2.9
    notaE 2.8
    notaE 2.7
    notaD 2.6
    notaE 2.4
    notaE 2.3
    notaC 2.0
    notaE 1.8
    notaE 1.8
    notaD 1.7
    notaE 0.9
    notaE 0.2
    notaB NA
    notaD NA
    Filtrar el data frame para quedarse con las filas en las que la columna sexo contenga el valor Mujer y la columna grupo contenga el valor A. Seleccionar las columnas Asignatura y Nota y ordenar el resultado de mayor a menor según la columna Nota.

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.

    Para crear un data frame a partir de un fichero de Excel podemos usar la siguiente función del paquete readxl de tidyverse:

    • read_excel(fichero/url). Lee un fichero de Excel y crea un data frame con los datos del fichero. Se puede usar la ruta local del fichero o la url si el fichero está en internet.
    library(readxl)
    df_A <- read_excel("datos/hipertension/datos-hospital-a.xls")
    head(df_A)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN
    1 SGL 1941-09-08 1998-07-13 1 165 78 42 78 104 176 175
    2 JCZ 1957-07-10 1998-05-09 1 154 74 30 95 114 162 160
    3 APZ 1967-08-18 2000-04-01 0 156 81 21 93 102 141 150
    4 NDG 1956-05-08 1998-11-13 0 181 82 33 86 91 162 161
    5 CLO 1958-11-02 1999-02-24 1 184 78 36 89 94 165 162
    6 LFZ 1953-06-13 2000-03-16 0 179 80 22 74 99 141 148
    Crear un data frame df_A con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/hipertension/datos-hospital-a.xls.
  2. Crear un data frame con los datos de los pacientes del hospital B del fichero csv datos-hospital-b.csv.

    df_B <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/hipertension/datos-hospital-b.csv")
    head(df_B)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN
    11 VSH 1965-12-15 1999-12-06 0 170 59 32.00 90 82 161 148
    12 SZS 1971-03-07 1999-02-13 1 154 61 20.25 92 102 147 153
    13 JSS 1964-01-03 1998-10-31 1 162 49 30.00 86 94 161 162
    14 BMH 1941-08-16 1999-09-16 0 162 77 26.00 93 77 152 151
    15 DGM 1969-01-24 1999-08-19 1 173 95 18.00 81 77 147 145
    16 POJ 1966-10-22 2000-10-29 1 177 63 19.00 72 96 145 150
    Crear un data frame df_B con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/hipertension/datos-hospital-b.csv.
  3. Fusionar los datos de los dos hospitales en un nuevo data frame.

    Para fusionar los datos de dos data frames podemos usar la siguiente función del paquete base de R:

    • rbind(df1, df2). Devuelve el data frame que resulta de fusionar las filas los data frames df1 y df2. Los dos data frames deben tener las mismas columnas.
    df <- rbind(df_A, df_B)
    head(df)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN
    1 SGL 1941-09-08 1998-07-13 1 165 78 42 78 104 176 175
    2 JCZ 1957-07-10 1998-05-09 1 154 74 30 95 114 162 160
    3 APZ 1967-08-18 2000-04-01 0 156 81 21 93 102 141 150
    4 NDG 1956-05-08 1998-11-13 0 181 82 33 86 91 162 161
    5 CLO 1958-11-02 1999-02-24 1 184 78 36 89 94 165 162
    6 LFZ 1953-06-13 2000-03-16 0 179 80 22 74 99 141 148

    Para fusionar los datos de dos data frames podemos usar la siguiente función del paquete dplyr de tidyverse:

    • bind_rows(df1, df2). Devuelve el data frame que resulta de fusionar las filas de los data frames df1 y df2. Los dos data frames deben tener las mismas columnas.
    df <- df_A |> bind_rows(df_B)
    head(df)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN
    1 SGL 1941-09-08 1998-07-13 1 165 78 42 78 104 176 175
    2 JCZ 1957-07-10 1998-05-09 1 154 74 30 95 114 162 160
    3 APZ 1967-08-18 2000-04-01 0 156 81 21 93 102 141 150
    4 NDG 1956-05-08 1998-11-13 0 181 82 33 86 91 162 161
    5 CLO 1958-11-02 1999-02-24 1 184 78 36 89 94 165 162
    6 LFZ 1953-06-13 2000-03-16 0 179 80 22 74 99 141 148
    Fusionar las filas de los data frames df_A y df_B en un nuevo data frame df.
  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")
    head(claves)
    CLAVE FARMACO
    1 Ca Antagonista + Diurético
    2 Ca Antagonista + Diurético
    3 Placebo
    4 Ca Antagonista + Diurético
    5 Ca Antagonista + Diurético
    6 Placebo
    Crear un data frame claves con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/hipertension/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 según una clave común, podemos usar la siguiente función del paquete dplyr de tidyverse:

    • left_join(df1, df2, by = clave). Devuelve un data frame con las filas de df1 y las columnas de df1 y df2. Si hay filas en df1 que no tienen una fila correspondiente en df2 según la clave, se rellenan con valores perdidos NA. Indicar la clave común entre los dos data frames en el argumento by.
    df <- df |> left_join(claves, by = "CLAVE")
    head(df)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN FARMACO
    1 SGL 1941-09-08 1998-07-13 1 165 78 42 78 104 176 175 Ca Antagonista + Diurético
    2 JCZ 1957-07-10 1998-05-09 1 154 74 30 95 114 162 160 Ca Antagonista + Diurético
    3 APZ 1967-08-18 2000-04-01 0 156 81 21 93 102 141 150 Placebo
    4 NDG 1956-05-08 1998-11-13 0 181 82 33 86 91 162 161 Ca Antagonista + Diurético
    5 CLO 1958-11-02 1999-02-24 1 184 78 36 89 94 165 162 Ca Antagonista + Diurético
    6 LFZ 1953-06-13 2000-03-16 0 179 80 22 74 99 141 148 Placebo
    Fusionar las columnas de los data frames df y claves usando como clave común la columna CLAVE. Actualizar el data frame df con el resultado de la fusión.
  6. Convertir la columna del sexo en un factor con dos niveles: Hombre y Mujer.

    df$SEXO <- factor(df$SEXO, levels = c(0, 1), labels = c("Hombre", "Mujer"))
    head(df)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN FARMACO
    1 SGL 1941-09-08 1998-07-13 Mujer 165 78 42 78 104 176 175 Ca Antagonista + Diurético
    2 JCZ 1957-07-10 1998-05-09 Mujer 154 74 30 95 114 162 160 Ca Antagonista + Diurético
    3 APZ 1967-08-18 2000-04-01 Hombre 156 81 21 93 102 141 150 Placebo
    4 NDG 1956-05-08 1998-11-13 Hombre 181 82 33 86 91 162 161 Ca Antagonista + Diurético
    5 CLO 1958-11-02 1999-02-24 Mujer 184 78 36 89 94 165 162 Ca Antagonista + Diurético
    6 LFZ 1953-06-13 2000-03-16 Hombre 179 80 22 74 99 141 148 Placebo
    df <- df |> mutate(SEXO = factor(SEXO, levels = c(0, 1), labels = c("Hombre", "Mujer")))
    head(df)
    CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN PAS_INI PAS_FIN FARMACO
    1 SGL 1941-09-08 1998-07-13 Mujer 165 78 42 78 104 176 175 Ca Antagonista + Diurético
    2 JCZ 1957-07-10 1998-05-09 Mujer 154 74 30 95 114 162 160 Ca Antagonista + Diurético
    3 APZ 1967-08-18 2000-04-01 Hombre 156 81 21 93 102 141 150 Placebo
    4 NDG 1956-05-08 1998-11-13 Hombre 181 82 33 86 91 162 161 Ca Antagonista + Diurético
    5 CLO 1958-11-02 1999-02-24 Mujer 184 78 36 89 94 165 162 Ca Antagonista + Diurético
    6 LFZ 1953-06-13 2000-03-16 Hombre 179 80 22 74 99 141 148 Placebo
    Convertir la columna SEXO del data frame df en un factor con dos niveles: Hombre para el valor 0 y Mujer para el valor 1.
  7. Crear una nueva columna con la edad de los pacientes en el momento de inclusión en el estudio.

    Para calcular la edad de los pacientes en el momento de inclusión en el estudio, podemos usar la siguiente función del paquete base de R:

    • difftime(fecha1, fecha2, units = unidades). Devuelve la diferencia entre dos fechas en la unidad de tiempo unidades (“days”, “hours”, “minutes”, “seconds”). Dividir el resultado entre 365 para obtener la edad en años.
    df$EDAD <- as.numeric(difftime(df$F_INCLUS, df$F_NACIM, units = "days")/365)
    head(df[, c("F_NACIM", "F_INCLUS", "EDAD")])
    F_NACIM F_INCLUS EDAD
    1941-09-08 1998-07-13 56.88219
    1957-07-10 1998-05-09 40.85753
    1967-08-18 2000-04-01 32.64384
    1956-05-08 1998-11-13 42.54521
    1958-11-02 1999-02-24 40.33973
    1953-06-13 2000-03-16 46.78904

    Para calcular la edad de los pacientes en el momento de inclusión en el estudio, podemos usar las siguientes funciones del paquete lubridate de tidyverse:

    df <- df |> mutate(AGE = time_length(interval(F_NACIM, F_INCLUS), "years"))
    head(df |>  select(F_NACIM, F_INCLUS, AGE))
    F_NACIM F_INCLUS AGE
    1941-09-08 1998-07-13 56.84384
    1957-07-10 1998-05-09 40.83014
    1967-08-18 2000-04-01 32.62022
    1956-05-08 1998-11-13 42.51781
    1958-11-02 1999-02-24 40.31233
    1953-06-13 2000-03-16 46.75683
    Crear una nueva columna de nombre EDAD con la edad de los pacientes en el momento de inclusión en el estudio. Calcular la edad como la diferencia entre la fecha de inclusión (F_INCLUS) y la fecha de nacimiento (F_NACIM) en años.
  8. Crear una nueva columna con el índice de masa corporal (IMC) de los pacientes.

    df$IMC <- df$PESO/(df$ALTURA/100)^2
    head(df[, c("PESO", "ALTURA", "IMC")])
    PESO ALTURA IMC
    78 165 28.65014
    74 154 31.20256
    81 156 33.28402
    82 181 25.02976
    78 184 23.03875
    80 179 24.96801
    df <- df |> mutate(IMC = PESO/(ALTURA/100)^2)
    head(df |> select(PESO, ALTURA, IMC))
    PESO ALTURA IMC
    78 165 28.65014
    74 154 31.20256
    81 156 33.28402
    82 181 25.02976
    78 184 23.03875
    80 179 24.96801
    Crear una nueva columna de nombre IMC con el índice de masa corporal de los pacientes calculado como el peso en kg dividido por la altura en metros al cuadrado.
  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.

    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")])
    PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS
    78 104 26 176 175 -1
    95 114 19 162 160 -2
    93 102 9 141 150 9
    86 91 5 162 161 -1
    89 94 5 165 162 -3
    74 99 25 141 148 7
    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))
    PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS
    78 104 26 176 175 -1
    95 114 19 162 160 -2
    93 102 9 141 150 9
    86 91 5 162 161 -1
    89 94 5 165 162 -3
    74 99 25 141 148 7
    Crear una nueva columna de nombre EVOL_PAD con la evolución de la presión arterial diastólica calculada como la presión diastólica final (PAD_FIN) menos la presión diastólica inicial (PAD_INI). Crear una nueva columna de nombre EVOL_PAS con la evolución de la presión arterial sistólica calculada como la presión sistólica final (PAS_FIN) menos la presión sistólica inicial (PAS_INI).
  10. Guardar el data frame en un fichero csv.

    Para guardar un data frame en un fichero csv podemos usar la siguiente función del paquete base de R:

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

    Para guardar un data frame en un fichero csv podemos usar la siguiente función del paquete readr de tidyverse:

    df  |> write_csv("datos/hipertension/datos-ensayo-clinico.csv")
    Guardar el data frame df en un fichero csv con la ruta 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?