Mes | Ingresos | Gastos | Impuestos |
---|---|---|---|
Enero | 45000 | 33400 | 6450 |
Febrero | 41500 | 35400 | 6300 |
Marzo | 51200 | 35600 | 7100 |
Abril | 49700 | 36300 | 6850 |
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
- Limpieza de datos.
- Imputación de valores perdidos.
- Recodificación de variables.
- Creación de nuevas variables.
- Transformación de variables.
- Selección de variables.
- Fusión de datos.
- Reestructuración del conjunto de datos.
3.1 Ejercicios Resueltos
Para la realización de esta práctica se requieren los siguientes paquetes.
library(tidyverse)
# Incluye los siguientes paquetes:
# - readr: para la lectura de ficheros csv.
# - dplyr: para el preprocesamiento y manipulación de datos.
# - lubridate: para el procesamiento de fechas.
Ejercicio 3.1 La siguiente tabla contiene los ingresos y gastos de una empresa durante el primer trimestre del año.
-
Crear un data frame con los datos de la tabla.
Solucióndf <- data.frame( Mes = c("Enero", "Febrero", "Marzo", "Abril"), Ingresos = c(45000, 41500, 51200, 49700), Gastos = c(33400, 35400, 35600, 36300), Impuestos = c(6450, 6300, 7100, 6850) ) df
Mes Ingresos Gastos Impuestos 1 Enero 45000 33400 6450 2 Febrero 41500 35400 6300 3 Marzo 51200 35600 7100 4 Abril 49700 36300 6850
-
Crear una nueva columna con los beneficios de cada mes (ingresos - gastos - impuestos).
SoluciónCon las funciones del paquete
base
de R.df$Beneficios <- df$Ingresos - df$Gastos - df$Impuestos df
Mes Ingresos Gastos Impuestos Beneficios 1 Enero 45000 33400 6450 5150 2 Febrero 41500 35400 6300 -200 3 Marzo 51200 35600 7100 8500 4 Abril 49700 36300 6850 6550
Con la función
mutate
del paquetedplyr
detidyverse
. La funciónmutate
permite añadir nuevas columnas a un data frame mediante una fórmula puede hacer referencia a las columnas existentes.df <- df |> mutate(Beneficios = Ingresos - Gastos - Impuestos) df
Mes Ingresos Gastos Impuestos Beneficios 1 Enero 45000 33400 6450 5150 2 Febrero 41500 35400 6300 -200 3 Marzo 51200 35600 7100 8500 4 Abril 49700 36300 6850 6550
-
Crear una nueva columna con el factor
Balance
con dos posibles categorías:positivo
si ha habido beneficios ynegativo
si ha habido pérdidas.SoluciónCon la función
cut
del paquetebase
de R. La funcióncut(vector, breaks, labels)
divide el vectorvector
en intervalos delimitados por los elementos del vectorbreaks
y crea un factor asignando a cada intervalo una etiqueta del vectorlabels
.Mes Ingresos Gastos Impuestos Beneficios Balance 1 Enero 45000 33400 6450 5150 positivo 2 Febrero 41500 35400 6300 -200 negativo 3 Marzo 51200 35600 7100 8500 positivo 4 Abril 49700 36300 6850 6550 positivo
Con la función
mutate
del paquetedplyr
detidyverse
.df <- df |> mutate(Balance = cut(Beneficios, breaks = c(-Inf, 0, Inf), labels = c("negativo", "positivo"))) df
Mes Ingresos Gastos Impuestos Beneficios Balance 1 Enero 45000 33400 6450 5150 positivo 2 Febrero 41500 35400 6300 -200 negativo 3 Marzo 51200 35600 7100 8500 positivo 4 Abril 49700 36300 6850 6550 positivo
-
Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.
SoluciónCon las funciones del paquete
base
de R.df[df$Balance == "positivo", c("Mes", "Beneficios")]
Mes Beneficios 1 Enero 5150 3 Marzo 8500 4 Abril 6550
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.
-
Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero
colesterol.csv
.SoluciónCon las funciones del paquete
base
de R.nombre edad sexo peso altura colesterol 1 José Luis Martínez Izquierdo 18 H 85 1.79 182 2 Rosa Díaz Díaz 32 M 65 1.73 232 3 Javier García Sánchez 24 H NA 1.81 191 4 Carmen López Pinzón 35 M 65 1.70 200 5 Marisa López Collado 46 M 51 1.58 148 6 Antonio Ruiz Cruz 68 H 66 1.74 249
Con la función
read_csv
del paquete del paquetereadr
detidyverse
.df <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/colesterol.csv")
Rows: 14 Columns: 6 ── Column specification ──────────────────────────────────────────────────────── Delimiter: "," chr (2): nombre, sexo dbl (4): edad, peso, altura, colesterol ℹ Use `spec()` to retrieve the full column specification for this data. ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(df)
# A tibble: 6 × 6 nombre edad sexo peso altura colesterol <chr> <dbl> <chr> <dbl> <dbl> <dbl> 1 José Luis Martínez Izquierdo 18 H 85 1.79 182 2 Rosa Díaz Díaz 32 M 65 1.73 232 3 Javier García Sánchez 24 H NA 1.81 191 4 Carmen López Pinzón 35 M 65 1.7 200 5 Marisa López Collado 46 M 51 1.58 148 6 Antonio Ruiz Cruz 68 H 66 1.74 249
-
Crear una nueva columna con el índice de masa corporal, usando la siguiente fórmula
SoluciónCon las funciones del paquete
base
de R.# A tibble: 6 × 7 nombre edad sexo peso altura colesterol imc <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> 1 José Luis Martínez Izquierdo 18 H 85 1.79 182 27 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 3 Javier García Sánchez 24 H NA 1.81 191 NA 4 Carmen López Pinzón 35 M 65 1.7 200 22 5 Marisa López Collado 46 M 51 1.58 148 20 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22
Con la función
mutate
del paquetedplyr
detidyverse
.# A tibble: 6 × 7 nombre edad sexo peso altura colesterol imc <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> 1 José Luis Martínez Izquierdo 18 H 85 1.79 182 27 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 3 Javier García Sánchez 24 H NA 1.81 191 NA 4 Carmen López Pinzón 35 M 65 1.7 200 22 5 Marisa López Collado 46 M 51 1.58 148 20 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22
-
Crear una nueva columna con la variable
obesidad
recodificando la columnaimc
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 SoluciónCon la función
cut
del paquetebase
de R.df$Obesidad <- cut(df$imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso")) head(df)
# A tibble: 6 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquier… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 4 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 5 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab…
Con las funciones del paquete
dplyr
detidyverse
.df <- df |> mutate(Obesidad = cut(imc, breaks = c(0, 18.5, 24.5, 30, Inf), labels = c("Bajo peso", "Saludable", "Sobrepeso", "Obeso"))) head(df)
# A tibble: 6 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquier… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 4 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 5 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab…
-
Seleccionar las columnas
nombre
,sexo
yedad
.SoluciónCon las funciones del paquete
base
de R.df[, c("nombre", "sexo", "edad")]
# A tibble: 14 × 3 nombre sexo edad <chr> <chr> <dbl> 1 José Luis Martínez Izquierdo H 18 2 Rosa Díaz Díaz M 32 3 Javier García Sánchez H 24 4 Carmen López Pinzón M 35 5 Marisa López Collado M 46 6 Antonio Ruiz Cruz H 68 7 Antonio Fernández Ocaña H 51 8 Pilar Martín González M 22 9 Pedro Gálvez Tenorio H 35 10 Santiago Reillo Manzano H 46 11 Macarena Álvarez Luna M 53 12 José María de la Guía Sanz H 58 13 Miguel Angel Cuadrado Gutiérrez H 27 14 Carolina Rubio Moreno M 20
Con la función
select
del paquetedplyr
detidyverse
.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
-
Anonimizar los datos eliminando la columna
nombre
.SoluciónCon las funciones del paquete
base
de R.df[, -1]
# A tibble: 14 × 7 edad sexo peso altura colesterol imc Obesidad <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 18 H 85 1.79 182 27 Sobrepeso 2 32 M 65 1.73 232 22 Saludable 3 24 H NA 1.81 191 NA <NA> 4 35 M 65 1.7 200 22 Saludable 5 46 M 51 1.58 148 20 Saludable 6 68 H 66 1.74 249 22 Saludable 7 51 H 62 1.72 276 21 Saludable 8 22 M 60 1.66 NA 22 Saludable 9 35 H 90 1.94 241 24 Saludable 10 46 H 75 1.85 280 22 Saludable 11 53 M 55 1.62 262 21 Saludable 12 58 H 78 1.87 198 22 Saludable 13 27 H 109 1.98 210 28 Sobrepeso 14 20 M 61 1.77 194 19 Saludable
Con la función
select
del paquetedplyr
detidyverse
.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
-
Reordenar las columnas poniendo la columna
sexo
antes que la columnaedad
.SoluciónCon las funciones del paquete
base
de R.df[, c(1, 3, 2, 4, 5, 6)]
# A tibble: 14 × 6 nombre sexo edad peso altura colesterol <chr> <chr> <dbl> <dbl> <dbl> <dbl> 1 José Luis Martínez Izquierdo H 18 85 1.79 182 2 Rosa Díaz Díaz M 32 65 1.73 232 3 Javier García Sánchez H 24 NA 1.81 191 4 Carmen López Pinzón M 35 65 1.7 200 5 Marisa López Collado M 46 51 1.58 148 6 Antonio Ruiz Cruz H 68 66 1.74 249 7 Antonio Fernández Ocaña H 51 62 1.72 276 8 Pilar Martín González M 22 60 1.66 NA 9 Pedro Gálvez Tenorio H 35 90 1.94 241 10 Santiago Reillo Manzano H 46 75 1.85 280 11 Macarena Álvarez Luna M 53 55 1.62 262 12 José María de la Guía Sanz H 58 78 1.87 198 13 Miguel Angel Cuadrado Gutiérrez H 27 109 1.98 210 14 Carolina Rubio Moreno M 20 61 1.77 194
Con la función
select
del paquetedplyr
detidyverse
.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…
-
Filtrar el data frame para quedarse con las mujeres.
SoluciónCon las funciones del paquete
base
de R.df[df$sexo == "M", ]
# A tibble: 6 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludable 2 Carmen López Pinzón 35 M 65 1.7 200 22 Saludable 3 Marisa López Collado 46 M 51 1.58 148 20 Saludable 4 Pilar Martín González 22 M 60 1.66 NA 22 Saludable 5 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludable 6 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludable
Con la función filter del paquete
dplyr
detidyverse
.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
-
Filtrar el data frame para quedarse con los hombres mayores de 30 años.
SoluciónCon las funciones del paquete
base
de R.df[df$sexo == "H" & df$edad > 30, ]
# A tibble: 5 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludable 2 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludable 3 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludable 4 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludable 5 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludable
Con la función
filter
paquetedplyr
detidyverse
.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
-
Filtrar el data frame para quedarse con las filas sin valores perdidos.
SoluciónCon la función
na.omit
del paquetebase
de R. La funciónna.omit
elimina las filas con valores perdidos.na.omit(df)
# A tibble: 12 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 4 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 5 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 6 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 7 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 8 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 9 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 10 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 11 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 12 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
Con la función
drop_na
del paquetetidyr
detidyverse
.df |> drop_na()
# A tibble: 12 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 4 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 5 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 6 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 7 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 8 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 9 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 10 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 11 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 12 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
-
Filtrar el data frame para eliminar las filas con datos perdidos en la columna
colesterol
.SoluciónCon las funciones del paquete
base
de R. La funciónis.na
devuelveTRUE
cuando se aplica a un valor perdidoNA
. Cuando se aplica a un vector devuelve un vector lógico conTRUE
en las posiciones con valores perdidos yFALSE
en las posiciones con valores no perdidos.df[!is.na(df$colesterol), ]
# A tibble: 13 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 4 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 5 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 7 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 8 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 9 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 10 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 11 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 12 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 13 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
Con la función filter del paquete
dplyr
detidyverse
.# 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…
-
Imputar los valores perdidos en la columna
colesterol
con la media de los valores no perdidos.SoluciónCon la función
mean
del paquetebase
de R. La funciónmean
calcula la media de un vector. Para que no se tengan en cuenta los valores perdidos se puede usar el argumentona.rm = TRUE
.media_colesterol <- mean(df$colesterol, na.rm = TRUE) df$colesterol[is.na(df$colesterol)] <- media_colesterol df
# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 4 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 5 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 7 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 8 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 9 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 10 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 11 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 12 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 13 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 14 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
Con la función
mutate
del paquetedplyr
detidyverse
. La funciónifelse
permite asignar un valor a un vector en función de una condición.df <- df |> mutate(colesterol = ifelse(is.na(colesterol), mean(colesterol, na.rm = TRUE), colesterol)) df
# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 2 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 3 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 4 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 5 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 6 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 7 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 8 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 9 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 10 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 11 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 12 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 13 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 14 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
-
Ordenar el data frame según la columna
nombre
.SoluciónCon la función
order
del paquetebase
de R. La funciónorder
devuelve un vector con los índices de las filas ordenadas de menor a mayor.df[order(df$nombre), ]
# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 2 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 3 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 4 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab… 5 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 6 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 7 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 8 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 9 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 10 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 11 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 12 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 13 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 14 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab…
Con la función
arrange
del paquetedplyr
detidyverse
.df |> arrange(nombre)
# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 2 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 3 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 4 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab… 5 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 6 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 7 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 8 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 9 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 10 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 11 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 12 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 13 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 14 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab…
-
Ordenar el data frame ascendentemente por la columna
sexo
y descendentemente por la columnaedad
.SoluciónCon las funciones del paquete
base
de R.df[order(df$sexo, -df$edad), ]
# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 2 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 3 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 4 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 5 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 6 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 7 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 8 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 9 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 10 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 11 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 12 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 13 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 14 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
Con la función
arrange
del paquetedplyr
detidyverse
. Para que la ordenación sea descendente con respecto a una variable se tiene que usar la funcióndesc
sobre la variable.# A tibble: 14 × 8 nombre edad sexo peso altura colesterol imc Obesidad <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <fct> 1 Antonio Ruiz Cruz 68 H 66 1.74 249 22 Saludab… 2 José María de la Guía Sanz 58 H 78 1.87 198 22 Saludab… 3 Antonio Fernández Ocaña 51 H 62 1.72 276 21 Saludab… 4 Santiago Reillo Manzano 46 H 75 1.85 280 22 Saludab… 5 Pedro Gálvez Tenorio 35 H 90 1.94 241 24 Saludab… 6 Miguel Angel Cuadrado Gut… 27 H 109 1.98 210 28 Sobrepe… 7 Javier García Sánchez 24 H NA 1.81 191 NA <NA> 8 José Luis Martínez Izquie… 18 H 85 1.79 182 27 Sobrepe… 9 Macarena Álvarez Luna 53 M 55 1.62 262 21 Saludab… 10 Marisa López Collado 46 M 51 1.58 148 20 Saludab… 11 Carmen López Pinzón 35 M 65 1.7 200 22 Saludab… 12 Rosa Díaz Díaz 32 M 65 1.73 232 22 Saludab… 13 Pilar Martín González 22 M 60 1.66 220. 22 Saludab… 14 Carolina Rubio Moreno 20 M 61 1.77 194 19 Saludab…
Ejercicio 3.3 El fichero notas-curso2.csv
contiene las notas de las asignaturas de un curso en varios grupos de alumnos.
-
Crear un data frame con los datos del curso a partir del fichero
notas-curso2.csv
.Solucióndf <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/notas-curso2.csv")
Rows: 120 Columns: 9 ── Column specification ──────────────────────────────────────────────────────── Delimiter: "," chr (4): sexo, turno, grupo, trabaja dbl (5): notaA, notaB, notaC, notaD, notaE ℹ Use `spec()` to retrieve the full column specification for this data. ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df
# A tibble: 120 × 9 sexo turno grupo trabaja notaA notaB notaC notaD notaE <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 Mujer Tarde C N 5.2 6.3 3.4 2.3 2 2 Hombre Mañana A N 5.7 5.7 4.2 3.5 2.7 3 Hombre Mañana B N 8.3 8.8 8.8 8 5.5 4 Hombre Mañana B N 6.1 6.8 4 3.5 2.2 5 Hombre Mañana A N 6.2 9 5 4.4 3.7 6 Hombre Mañana A S 8.6 8.9 9.5 8.4 3.9 7 Mujer Mañana A N 6.7 7.9 5.6 4.8 4.2 8 Mujer Tarde C S 4.1 5.2 1.7 0.3 1 9 Hombre Tarde C N 5 5 3.3 2.7 6 10 Hombre Tarde C N 5.3 6.3 4.8 3.6 2.3 # ℹ 110 more rows
-
Convertir el data frame a formato largo.
SoluciónPara convertir un data frame de formato ancho a largo se puede usar la función
pivot_longer
del paquetetidyr
detidyverse
.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
-
Crear una nueva columna con la variable
calificación
que contenga las calificaciones de cada asignatura.Solucióndf_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
-
Filtrar el conjunto de datos para obtener las asignaturas y las notas de las mujeres del grupo A, ordenadas de mayor a menor.
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)
-
Crear un data frame con los datos de los pacientes del hospital A del fichero de Excel datos-hospital-a.xls.
Soluciónlibrary(readxl) dfA <- read_excel("datos/hipertension/datos-hospital-a.xls") head(dfA)
# A tibble: 6 × 12 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <dbl> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 1 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 1 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 0 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 0 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 1 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 0 179 80 22 # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>
-
Crear un data frame con los datos de los pacientes del hospital B del fichero csv datos-hospital-b.csv.
SolucióndfB <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/hipertension/datos-hospital-b.csv")
Rows: 90 Columns: 12 ── Column specification ──────────────────────────────────────────────────────── Delimiter: "," chr (1): NOMBRE dbl (9): CLAVE, SEXO, ALTURA, PESO, ESTRES, PAD_INI, PAD_FIN, PAS_INI, PAS_FIN date (2): F_NACIM, F_INCLUS ℹ Use `spec()` to retrieve the full column specification for this data. ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(dfB)
# A tibble: 6 × 12 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES PAD_INI PAD_FIN <dbl> <chr> <date> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 11 VSH 1965-12-15 1999-12-06 0 170 59 32 90 82 2 12 SZS 1971-03-07 1999-02-13 1 154 61 20.2 92 102 3 13 JSS 1964-01-03 1998-10-31 1 162 49 30 86 94 4 14 BMH 1941-08-16 1999-09-16 0 162 77 26 93 77 5 15 DGM 1969-01-24 1999-08-19 1 173 95 18 81 77 6 16 POJ 1966-10-22 2000-10-29 1 177 63 19 72 96 # ℹ 2 more variables: PAS_INI <dbl>, PAS_FIN <dbl>
-
Fusionar los datos de los dos hospitales en un nuevo data frame.
SoluciónCon la función
rbind
del paquetebase
de R.# A tibble: 6 × 12 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <dbl> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 1 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 1 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 0 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 0 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 1 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 0 179 80 22 # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>
Con la función
bind_rows
del paquetedplyr
detidyverse
.# A tibble: 6 × 12 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <dbl> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 1 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 1 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 0 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 0 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 1 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 0 179 80 22 # ℹ 4 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>
-
Crear un data frame con los datos de las claves de aleatorización del fichero csv claves-aleatorizacion.csv.
Soluciónclaves <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/hipertension/claves-aleatorizacion.csv")
Rows: 100 Columns: 2 ── Column specification ──────────────────────────────────────────────────────── Delimiter: "," chr (1): FARMACO dbl (1): CLAVE ℹ Use `spec()` to retrieve the full column specification for this data. ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(claves)
# A tibble: 6 × 2 CLAVE FARMACO <dbl> <chr> 1 1 Ca Antagonista + Diurético 2 2 Ca Antagonista + Diurético 3 3 Placebo 4 4 Ca Antagonista + Diurético 5 5 Ca Antagonista + Diurético 6 6 Placebo
-
Fusionar el data frame con los datos clínicos y el data frame con claves de aleatorización en un nuevo data frame.
SoluciónPara fusionar las columnas de dos data frames usando una misma columna como clave en ambos data frames se puede la función
left_join
del paquetedplyr
detidyverse
.# A tibble: 6 × 13 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <dbl> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 1 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 1 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 0 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 0 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 1 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 0 179 80 22 # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>, FARMACO <chr>
-
Convertir la columna del sexo en un factor con dos niveles:
Hombre
yMujer
.SoluciónCon la función del paquete
base
de R.# A tibble: 6 × 13 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <fct> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 Mujer 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 Mujer 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 Homb… 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 Homb… 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 Mujer 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 Homb… 179 80 22 # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>, FARMACO <chr>
Con la función
mutate
del paquetedplyr
detidyverse
.# A tibble: 6 × 13 CLAVE NOMBRE F_NACIM F_INCLUS SEXO ALTURA PESO ESTRES <dbl> <chr> <dttm> <dttm> <fct> <dbl> <dbl> <dbl> 1 1 SGL 1941-09-08 00:00:00 1998-07-13 00:00:00 Mujer 165 78 42 2 2 JCZ 1957-07-10 00:00:00 1998-05-09 00:00:00 Mujer 154 74 30 3 3 APZ 1967-08-18 00:00:00 2000-04-01 00:00:00 Homb… 156 81 21 4 4 NDG 1956-05-08 00:00:00 1998-11-13 00:00:00 Homb… 181 82 33 5 5 CLO 1958-11-02 00:00:00 1999-02-24 00:00:00 Mujer 184 78 36 6 6 LFZ 1953-06-13 00:00:00 2000-03-16 00:00:00 Homb… 179 80 22 # ℹ 5 more variables: PAD_INI <dbl>, PAD_FIN <dbl>, PAS_INI <dbl>, # PAS_FIN <dbl>, FARMACO <chr>
-
Crear una nueva columna con la edad de los pacientes en el momento de inclusión en el estudio.
SoluciónCon la función del paquete
base
de R.df$EDAD <- as.numeric(difftime(df$F_INCLUS, df$F_NACIM, units = "days")/365) head(df[, c("F_NACIM", "F_INCLUS", "EDAD")])
# A tibble: 6 × 3 F_NACIM F_INCLUS EDAD <dttm> <dttm> <dbl> 1 1941-09-08 00:00:00 1998-07-13 00:00:00 56.9 2 1957-07-10 00:00:00 1998-05-09 00:00:00 40.9 3 1967-08-18 00:00:00 2000-04-01 00:00:00 32.6 4 1956-05-08 00:00:00 1998-11-13 00:00:00 42.5 5 1958-11-02 00:00:00 1999-02-24 00:00:00 40.3 6 1953-06-13 00:00:00 2000-03-16 00:00:00 46.8
Con las funciones
interval
ytime_length
del paquetelubridate
detidyverse
. La funcióninterval
permite crear un intervalo de tiempo entre dos fechas y la funcióntime_length
permite calcular la longitud de un intervalo en una determinada unidad de tiempo.df <- df |> mutate(AGE = time_length(interval(F_NACIM, F_INCLUS), "years")) head(df |> select(F_NACIM, F_INCLUS, AGE))
# A tibble: 6 × 3 F_NACIM F_INCLUS AGE <dttm> <dttm> <dbl> 1 1941-09-08 00:00:00 1998-07-13 00:00:00 56.8 2 1957-07-10 00:00:00 1998-05-09 00:00:00 40.8 3 1967-08-18 00:00:00 2000-04-01 00:00:00 32.6 4 1956-05-08 00:00:00 1998-11-13 00:00:00 42.5 5 1958-11-02 00:00:00 1999-02-24 00:00:00 40.3 6 1953-06-13 00:00:00 2000-03-16 00:00:00 46.8
-
Crear una nueva columna con el índice de masa corporal (IMC) de los pacientes.
SoluciónCon las funciones del paquete
base
de R. -
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.
SoluciónCon las funciones del paquete
base
de R.df$EVOL_PAD <- df$PAD_FIN - df$PAD_INI df$EVOL_PAS <- df$PAS_FIN - df$PAS_INI head(df[, c("PAD_INI", "PAD_FIN", "EVOL_PAD", "PAS_INI", "PAS_FIN", "EVOL_PAS")])
# A tibble: 6 × 6 PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 78 104 26 176 175 -1 2 95 114 19 162 160 -2 3 93 102 9 141 150 9 4 86 91 5 162 161 -1 5 89 94 5 165 162 -3 6 74 99 25 141 148 7
Con la función
mutate
del paquetedplyr
detidyverse
.df <- df |> mutate(EVOL_PAD = PAD_FIN - PAD_INI, EVOL_PAS = PAS_FIN - PAS_INI) head(df |> select(PAD_INI, PAD_FIN, EVOL_PAD, PAS_INI, PAS_FIN, EVOL_PAS))
# A tibble: 6 × 6 PAD_INI PAD_FIN EVOL_PAD PAS_INI PAS_FIN EVOL_PAS <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 78 104 26 176 175 -1 2 95 114 19 162 160 -2 3 93 102 9 141 150 9 4 86 91 5 162 161 -1 5 89 94 5 165 162 -3 6 74 99 25 141 148 7
-
Guardar el data frame en un fichero 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) |
Crear un data frame con los datos de los vinos blancos partir del fichero de Excel
vinos-blancos.xlsx
.Crear un data frame con los datos de los vinos tintos partir del fichero csv
vinos-tintos.csv
.Fusionar los datos de los vinos blancos y tintos en un nuevo data frame.
Convertir el tipo de vino en un factor.
Imputar los valores perdidos del alcohol con la media de los valores no perdidos para cada tipo de vino.
-
Crear un factor
Envejecimiento
recodificando la variablemeses.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 -
Crear un factor
Dulzor
recodificando la variableazucar.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 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.
¿Cuántos vinos blancos con un contenido en alcohol superior al 12% y una calidad superior a 8 hay en el conjunto de datos?