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.
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 |
-
Crear un data frame con los datos de la tabla.
TipSolució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) ) dfMes Ingresos Gastos Impuestos Enero 45000 33400 6450 Febrero 41500 35400 6300 Marzo 51200 35600 7100 Abril 49700 36300 6850 -
Crear una nueva columna con los beneficios de cada mes (ingresos - gastos - impuestos).
TipSoluciónPara añadir una nueva columna a partir de una fórmula podemos usar la sintaxis
df$variable <- fórmulapara crear una nueva columna en el data framedfcon nombrevariable. Para asignar los valores de la nueva columna se usa lafórmulaindicada. 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 dfMes 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
dplyrdetidyverse:-
mutate(variable = fórmula). Añade al data framedfuna nueva columna con nombrevariabley valores generados mediante la fórmulafórmula. Una fórmula puede hacer referencia a otras columnas existentes y contener operadores aritméticos, lógicos o funciones.
Añadir al data frame df una nueva columna de nombre Beneficios con los beneficios de cada mes. -
-
Crear una nueva columna con el factor
Balancecon dos posibles categorías:positivosi ha habido beneficios ynegativosi ha habido pérdidas.TipSoluciónPara asignar un valor a una nueva columna a partir de una condición podemos usar la siguiente función del paquete
basede R:-
ifelse(condicion, código_true, código_false)del paquetebasede R. Evalúa lacondicióny ejecuta elcódigo_truesi la condición es verdadera ycódigo_falsesi la condición es falsa.
Y para convertir la nueva columna en un factor con dos niveles se puede usar la siguiente función del paquete
basede R:-
factor(variable, levels = niveles, labels = etiquetas)del paquetebasede R. Convierte lavariableen un factor. Se pueden especificar los niveles del factor con el argumentolevelsy las etiquetas de los niveles con el argumentolabels. 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.
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
dplyrdetidyverse:-
mutate(variable = fórmula). Añade al data framedfuna nueva columna con nombrevariabley valores generados mediante la fórmulafórmula.
Para asignar un valor a una nueva columna a partir de una condición podemos usar la siguiente función del paquete
basede R:-
ifelse(condicion, código_true, código_false). Evalúa lacondicióny ejecuta elcódigo_truesi la condición es verdadera ycódigo_falsesi la condición es falsa.
Y para convertir la nueva columna en un factor con dos niveles se puede usar la siguiente función del paquete
basede R:-
factor(variable, levels = niveles, labels = etiquetas). Convierte lavariableen un factor. Se pueden especificar los niveles del factor con el argumentolevelsy las etiquetas de los niveles con el argumentolabels. 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.
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. -
-
Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.
TipSoluciónPara filtrar un data frame podemos usar la siguiente sintaxis
-
df[condición, columnas]. Devuelve un data frame con las filas que cumplan lacondicióny las columnas indicadas encolumnas. 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
dplyrdetidyverse:-
filter(df, condición). Devuelve un data frame con las filas del data framedfque cumplen lacondició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 framedfindicadas encolumnas.
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.
-
Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero
colesterol.csv.TipSoluciónPara crear un data frame a partir de un fichero csv podemos usar siguiente función del paquete
basede R:-
read.csv(fichero/url). Lee el fichero csv desde la ruta dada porficheroo la url dada porurly 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.
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
readrdetidyverse:-
read_csv(fichero/url). Lee el fichero csv desde la ruta dada porficheroo la url dada porurly 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.
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. -
-
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} \]
TipSoluciónnombre 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
dplyrdetidyverse:-
mutate(df, variable = fórmula). Añade al data framedfuna nueva columna con nombrevariabley valores generados mediante la fórmulafórmula.
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. -
-
Crear una nueva columna con la variable
obesidadrecodificando la columnaimcen 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 TipSoluciónPara categorizar la columna
imcen las diferentes categorías de obesidad, podemos usar la siguiente función del paquetebasede R:-
[cut(vector, breaks, labels)](https://rdrr.io/r/base/cut.html). Divide el vectorvectoren intervalos delimitados por los elementos del vectorbreaksy crea un factor asignando a cada intervalo una etiqueta del vectorlabels.
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
dplyrdetidyverse:-
mutate(df, variable = fórmula). Añade al data framedfuna nueva columna con nombrevariabley valores generados mediante la fórmulafórmula.
Para categorizar la columna
imcen las diferentes categorías de obesidad, en la fórmula podemos la siguiente función del paquetebasede R:-
cut(vector, breaks, labels)del paquetebasede R. Divide el vectorvectoren intervalos delimitados por los elementos del vectorbreaksy crea un factor asignando a cada intervalo una etiqueta del vectorlabels.
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. -
-
Seleccionar las columnas
nombre,sexoyedad.TipSolucióndf[, 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
dplyrdetidyverse:-
select(df, columnas). Devuelve un data frame con las columnas del data framedfindicadas encolumnas.
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. -
-
Anonimizar los datos eliminando la columna
nombre.TipSolucióndf[, -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
dplyrdetidyverse:-
select(df, -columnas). Devuelve un data frame con las columnas del data framedfmenos las columnas indicadas encolumnas.
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. -
-
Reordenar las columnas poniendo la columna
sexoantes que la columnaedad.TipSoluciónPara 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 framedfindicadas encolumnas. 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
dplyrdetidyverse:-
select(df, columnas). Devuelve un data frame con las columnas del data framedfindicadas encolumnas. 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. -
-
Filtrar el data frame para quedarse con las mujeres.
TipSoluciónPara filtrar un data frame podemos usar la siguiente sintaxis:
-
df[condición, ]. Devuelve un data frame con las filas del data framedfque satisfacen lacondiciónindicada. 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
dplyrdetidyverse:-
filter(df, condición). Devuelve un data frame con las filas del data framedfque satisfacen lacondiciónindicada. 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. -
-
Filtrar el data frame para quedarse con los hombres mayores de 30 años.
TipSolucióndf[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. -
Filtrar el data frame para quedarse con las filas sin valores perdidos.
TipSoluciónPara eliminar las filas que contienen valores perdidos podemos usar la siguiente función del paquete
basede R:-
na.omit(df). Devuelve el data frame que resulta de eliminar las filas con valores perdidos del data framedf.
na.omit(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
tidyrdetidyverse:-
drop_na(df). Devuelve el data frame que resulta de eliminar las filas con valores perdidos del data framedf.
drop_na(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. -
-
Filtrar el data frame para eliminar las filas con datos perdidos en la columna
colesterol.TipSoluciónPara 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
basede R:-
is.na. DevuelveTRUEcuando se aplica a un valor perdidoNA. Cuando se aplica a un vector devuelve un vector lógico conTRUEen las posiciones con valores perdidos yFALSEen 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
basede R:-
is.na. DevuelveTRUEcuando se aplica a un valor perdidoNA. Cuando se aplica a un vector devuelve un vector lógico conTRUEen las posiciones con valores perdidos yFALSEen las posiciones con valores no perdidos.
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. -
-
Imputar los valores perdidos en la columna
colesterolcon la media de los valores no perdidos.TipSoluciónPara 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
basede R:-
mean(vector, na.rm = TRUE). Calcula la media de unvectorsin tener en cuenta los valores perdidos.
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
dplyrdetidyverse:-
mutate(df, variable = fórmula). Añade al data framedfuna nueva columna con nombrevariabley valores generados mediante la fórmulafó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
basede R:if_else(condición, código_true, código_false). Evalúa lacondicióny ejecuta elcódigo_truesi la condición es verdadera ycódigo_falsesi la condición es falsa. Usar la funciónis.naen la condición.mean(vector, na.rm = TRUE). Calcula la media de unvectorsin tener en cuenta los valores perdidos.
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. -
-
Ordenar el data frame según la columna
nombre.TipSoluciónPara ordenar las filas de un data frame según el valor de una columna, podemos usar la siguiente función del paquete
basede 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
dplyrdetidyverse:-
arrange(df, columnas). Ordena las filas del data framedfsegún las columnas indicadas encolumnas. Indicar las columnas en el orden de prioridad para la ordenación. Usar la funcióndesc(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. -
-
Ordenar el data frame ascendentemente por la columna
sexoy descendentemente por la columnaedad.TipSolucióndf[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 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.
-
Crear un data frame con los datos del curso a partir del fichero
notas-curso2.csv.TipSolucióndf <- read_csv("https://aprendeconalf.es/estadistica-practicas-r/datos/notas-curso2.csv") dfsexo 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. -
Convertir el data frame a formato largo.
TipSoluciónPara convertir un data frame a formato largo podemos usar la siguiente función del paquete
tidyrdetidyverse:-
pivot_longer(df, columnas, names_to = columna_nombres, values_to = columna_valores). Devuelve un data frame con los datos de la columna indicada encolumnasen formato largo. Indicar las columnas que contienen las notas de las asignaturas encolumnas. Indicar el nombre de la nueva columna que contendrá los nombres de las asignaturas encolumna_nombresy el nombre de la nueva columna que contendrá las notas encolumna_valores.
df_largo <- df |> pivot_longer(notaA:notaE, names_to = "Asignatura", values_to = "Nota") df_largosexo 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. -
-
Crear una nueva columna con la variable
calificaciónque contenga las calificaciones de cada asignatura.TipSoluciónsexo 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 -
Filtrar el conjunto de datos para obtener las asignaturas y las notas de las mujeres del grupo A, ordenadas de mayor a menor.
TipSoluciónAsignatura 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)
-
Crear un data frame con los datos de los pacientes del hospital A del fichero de Excel datos-hospital-a.xls.
TipSoluciónPara crear un data frame a partir de un fichero de Excel podemos usar la siguiente función del paquete
readxldetidyverse:-
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. -
-
Crear un data frame con los datos de los pacientes del hospital B del fichero csv datos-hospital-b.csv.
TipSoluciónCLAVE 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. -
Fusionar los datos de los dos hospitales en un nuevo data frame.
TipSoluciónPara fusionar los datos de dos data frames podemos usar la siguiente función del paquete
basede R:-
rbind(df1, df2). Devuelve el data frame que resulta de fusionar las filas los data framesdf1ydf2. Los dos data frames deben tener las mismas columnas.
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
dplyrdetidyverse:-
bind_rows(df1, df2). Devuelve el data frame que resulta de fusionar las filas de los data framesdf1ydf2. Los dos data frames deben tener las mismas columnas.
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. -
-
Crear un data frame con los datos de las claves de aleatorización del fichero csv claves-aleatorizacion.csv.
TipSoluciónCrear un data frame claves con los datos del fichero https://aprendeconalf.es/bioestadistica-practicas-r/datos/hipertension/claves-aleatorizacion.csv. -
Fusionar el data frame con los datos clínicos y el data frame con claves de aleatorización en un nuevo data frame.
TipSoluciónPara fusionar las columnas de dos data frames según una clave común, podemos usar la siguiente función del paquete
dplyrdetidyverse:-
left_join(df1, df2, by = clave). Devuelve un data frame con las filas dedf1y las columnas dedf1ydf2. Si hay filas endf1que no tienen una fila correspondiente endf2según la clave, se rellenan con valores perdidosNA. Indicar la clave común entre los dos data frames en el argumentoby.
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. -
-
Convertir la columna del sexo en un factor con dos niveles:
HombreyMujer.TipSoluciónCLAVE 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 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. -
Crear una nueva columna con la edad de los pacientes en el momento de inclusión en el estudio.
TipSoluciónPara calcular la edad de los pacientes en el momento de inclusión en el estudio, podemos usar la siguiente función del paquete
basede 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
lubridatedetidyverse:interval(fecha1, fecha2). Devuelve un intervalo de tiempo entre dos fechas.time_length(interval, unit = unidades). Devuelve la longitud de un intervalo en la unidad de tiempo unidades (“year”, “week”, “day”, “hour”, “minute”, “second”).
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. -
-
Crear una nueva columna con el índice de masa corporal (IMC) de los pacientes.
TipSoluciónCrear 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. -
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.
TipSoluciónPAD_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 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). -
Guardar el data frame en un fichero csv.
TipSoluciónPara guardar un data frame en un fichero csv podemos usar la siguiente función del paquete
basede R:-
write.csv(df, fichero). Guardar un data frame en un fichero csv con la ruta indicada enfichero.
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
readrdetidyverse:-
write_csv(df, fichero). Guardar un data frame en un fichero csv con la ruta indicada enfichero.
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) |
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
Envejecimientorecodificando la variablemeses.barricaen 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
Dulzorrecodificando la variableazucar.residualen 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?
