LAB1 - Ejercicios y casos prácticos con R
Objetivos y enfoque
La finalidad de este documento es reproducir los ejercicios y casos prácticos contenidos en el apartado 13 del documento [1].
Para tener centralizado todo el trabajo se ha generado un proyecto y así fijar un directorio de trabajo que es el que contiene el fichero .Rproj.
[1] Casals, M. y Vila A. (2024). Introducción al lenguaje R, Rstudio y R Markdown. [Recurso de aprendizaje textual]. 1.a ed. Fundació Universitat Oberta de Catalunya (FUOC).
Ejercicio 1
Utilizando las funciones citadas en este Laboratorio, comprobad qué
paquetes tenéis instalados en vuestra versión de RStudio e instalad el
paquete MASS y el paquete Survival y comprobad la
información que contienen.
Buscad información sobre el paquete Rcmdr (R Commander) desde la consola.
## [1] "C:/Users/merce/AppData/Local/R/win-library/4.3"
## [2] "C:/Program Files/R/R-4.3.3/library"
## [1] ".GlobalEnv" "package:stats" "package:graphics"
## [4] "package:grDevices" "package:utils" "package:datasets"
## [7] "package:methods" "Autoloads" "package:base"
## Package: MASS
## Priority: recommended
## Version: 7.3-60.0.1
## Date: 2024-01-12
## Revision: $Rev: 3621 $
## Depends: R (>= 4.0), grDevices, graphics, stats, utils
## Imports: methods
## Suggests: lattice, nlme, nnet, survival
## Authors@R: c(person("Brian", "Ripley", role = c("aut", "cre", "cph"),
## email = "ripley@stats.ox.ac.uk"), person("Bill", "Venables",
## role = "ctb"), person(c("Douglas", "M."), "Bates", role =
## "ctb"), person("Kurt", "Hornik", role = "trl", comment =
## "partial port ca 1998"), person("Albrecht", "Gebhardt", role =
## "trl", comment = "partial port ca 1998"), person("David",
## "Firth", role = "ctb"))
## Description: Functions and datasets to support Venables and Ripley,
## "Modern Applied Statistics with S" (4th edition, 2002).
## Title: Support Functions and Datasets for Venables and Ripley's MASS
## LazyData: yes
## ByteCompile: yes
## License: GPL-2 | GPL-3
## URL: http://www.stats.ox.ac.uk/pub/MASS4/
## Contact: <MASS@stats.ox.ac.uk>
## NeedsCompilation: yes
## Packaged: 2024-01-13 12:39:26 UTC; ripley
## Author: Brian Ripley [aut, cre, cph], Bill Venables [ctb], Douglas M.
## Bates [ctb], Kurt Hornik [trl] (partial port ca 1998), Albrecht
## Gebhardt [trl] (partial port ca 1998), David Firth [ctb]
## Maintainer: Brian Ripley <ripley@stats.ox.ac.uk>
## Repository: CRAN
## Date/Publication: 2024-01-13 13:36:16 UTC
## Built: R 4.3.3; x86_64-w64-mingw32; 2024-03-07 01:49:20 UTC; windows
## Archs: x64
##
## -- File: C:/Users/merce/AppData/Local/R/win-library/4.3/MASS/Meta/package.rds
## Title: Survival Analysis
## Priority: recommended
## Package: survival
## Version: 3.5-8
## Date: 2024-02-13
## Depends: R (>= 3.5.0)
## Imports: graphics, Matrix, methods, splines, stats, utils
## LazyData: Yes
## LazyDataCompression: xz
## ByteCompile: Yes
## Authors@R: c(person(c("Terry", "M"), "Therneau",
## email="therneau.terry@mayo.edu", role=c("aut", "cre")),
## person("Thomas", "Lumley", role=c("ctb", "trl"),
## comment="original S->R port and R maintainer until 2009"),
## person("Atkinson", "Elizabeth", role="ctb"), person("Crowson",
## "Cynthia", role="ctb"))
## Description: Contains the core survival analysis routines, including
## definition of Surv objects, Kaplan-Meier and Aalen-Johansen
## (multi-state) curves, Cox models, and parametric accelerated
## failure time models.
## License: LGPL (>= 2)
## URL: https://github.com/therneau/survival
## NeedsCompilation: yes
## Packaged: 2024-02-13 23:24:58 UTC; therneau
## Author: Terry M Therneau [aut, cre], Thomas Lumley [ctb, trl] (original
## S->R port and R maintainer until 2009), Atkinson Elizabeth
## [ctb], Crowson Cynthia [ctb]
## Maintainer: Terry M Therneau <therneau.terry@mayo.edu>
## Repository: CRAN
## Date/Publication: 2024-02-14 10:20:23 UTC
## Built: R 4.3.3; x86_64-w64-mingw32; 2024-03-07 02:48:49 UTC; windows
## Archs: x64
##
## -- File: C:/Users/merce/AppData/Local/R/win-library/4.3/survival/Meta/package.rds
Buscad información sobre el paquete Rcmdr (R Commander) desde la consola.
Ejercicio 2
- Importad un archivo de texto y buscad un
summary()de tres variables que escojáis.
Datos descargados de [https://github.com/dotnet/machinelearning/blob/main/test/data/breast-cancer-withheader.txt]
df_breastcancer <- read.csv("Datos/breast-cancer-withheader.txt", sep="")
summary(df_breastcancer[c(2,3,4)])## thickness uniform_size uniform_shape
## Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000
## Median : 4.000 Median : 1.000 Median : 1.000
## Mean : 4.442 Mean : 3.151 Mean : 3.215
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000
## Max. :10.000 Max. :10.000 Max. :10.000
- Importad un archivo «.csv» y buscad un
fivenum()de dos variables que os parezcan relevantes para el estudio.
Datos descargados de: [https://www.kaggle.com/datasets/mahad049/heart-health-stats-dataset?resource=download&select=Heart_health.csv]
## [1] "ID" "Name" "Age"
## [4] "Gender" "Height.cm." "Weight.kg."
## [7] "Blood.Pressure.mmHg." "Cholesterol.mg.dL." "Glucose.mg.dL."
## [10] "Smoker" "Exercise.hours.week." "Heart.Attack"
## [1] 75 88 92 96 100
## [1] 170 195 210 215 230
Ejercicio 3
A partir del conjunto de datos anorexia del paquete
MASS, que corresponden a los datos de cambio de peso de pacientes
jóvenes con anorexia, mostrad los tipos de datos que contiene y
comprobad si existen valores NA y NULL. Para la variable Treat,
transformad los valores «CBT», «Cont» y FT en «Cogn Beh Tr», «Contr» y
«Fam Tr», respectivamente.
##
## FALSE
## 216
#Cambio de etiquetas en la variable "Treat"
levels(df_anorexia$Treat)[levels(df_anorexia$Treat) == "CBT"] <- "Cogn Beh Tr"
levels(df_anorexia$Treat)[levels(df_anorexia$Treat) == "Cont"] <- "Contr"
levels(df_anorexia$Treat)[levels(df_anorexia$Treat) == "FT"] <- "Fam Tr"
summary(df_anorexia$Treat)## Cogn Beh Tr Contr Fam Tr
## 29 26 17
Ejercicio 4
- Exportad los datos biopsy del paquete MASS a un archivo «.csv.»
- Exportad los datos
melanomadel paqueteMASSa archivos de tres diferentes formatos y comprobad que se han creado los diferentes archivos en los formatos y las rutasespecificados. Podéis generar una captura de pantalla de su ubicación en la carpeta.
library(xlsx)
df_melanoma <- Melanoma
write.csv(df_melanoma,file = "Datos/melanoma1_data.csv")
write.xlsx(df_melanoma,"Datos/melanoma2_data.xlsx")
write.table(df_melanoma,"Datos/melanoma3_data.txt",sep="")- Generad un resumen (summary) de la variable age de melanoma y guardad la salida que os aparece en un documento .doc
var_age <- capture.output(summary(df_melanoma$age), file=NULL,append=FALSE)
df_var_age <- as.data.frame(var_age)
write.table(df_var_age,"Datos/var_age_melanoma.doc",sep="")- Buscad un data frame en algún repositorio de datos de Biomedicina, descargad un conjunto de datos en «.csv» e importad este fichero a un documento R Markdown usando el código o el menú de importación de RStudio.
Importación del data frame biopsy_data.csv de
la carpeta Datos/.
Ejercicio 5
En el siguiente ejemplo veremos cómo utilizar diferentes operadores
sobre el conjunto de datos birthwt, así como también
algunas funciones que nos permiten obtener más información de las
variables:
Descripción de las variables:
low: indicator of birth weight less than 2.5 kg.
age: mother’s age in years.
lwt: mother’s weight in pounds at last menstrual period.
race: mother’s race (1 = white, 2 = black, 3 = other).
smoke: smoking status during pregnancy.
ptl: number of previous premature labours.
ht: history of hypertension.
ui: presence of uterine irritability.
ftv: number of physician visits during the first trimester.
bwt: birth weight in grams.
- ¿Cuál es la edad máxima de las madres del conjunto de datos?
## [1] 45
- ¿Cuál es la edad mínima de las madres del conjunto de datos?
## [1] 14
- ¿Cuál es el rango de edad de las madres?
- ¿Fumaba la madre cuyo recién nacido era el de menor peso?
if (df_birthwt$smoke[df_birthwt$bwt==min(df_birthwt$bwt)] == 1) {
print("Sí fumaba")
} else {
print("No fumaba")
}## [1] "Sí fumaba"
- ¿Cuánto pesó el recién nacido cuya madre tenía la edad máxima?
## [1] "El niño pesó (gramos):"
## [1] 4990
- Listad los pesos de los recién nacidos, cuyas madres visitaran menos de dos veces al médico durante el primer trimestre.
## [1] 2523 2557 2600 2622 2637 2637 2663 2665 2722 2733 2751 2769 2769 2778 2807
## [16] 2821 2836 2863 2877 2906 2920 2920 2920 2948 2948 2977 2977 2922 3033 3062
## [31] 3062 3062 3062 3090 3090 3100 3104 3132 3175 3175 3203 3203 3203 3225 3225
## [46] 3232 3234 3260 3274 3317 3317 3331 3374 3374 3402 3416 3444 3459 3460 3473
## [61] 3544 3487 3544 3572 3572 3586 3600 3614 3614 3629 3637 3643 3651 3651 3651
## [76] 3651 3699 3728 3756 3770 3770 3770 3790 3799 3827 3884 3912 3940 3941 3941
## [91] 3969 3997 3997 4054 4054 4111 4174 4238 4593 4990 709 1135 1330 1474 1588
## [106] 1588 1701 1729 1790 1818 1885 1893 1899 1928 1936 1970 2055 2055 2084 2084
## [121] 2100 2125 2187 2187 2211 2225 2240 2240 2282 2296 2296 2325 2353 2353 2367
## [136] 2381 2381 2381 2410 2410 2410 2424 2442 2466 2466 2495 2495
Ejercicio 6
A partir del conjunto de datos anorexia trabajado en
apartados anteriores, cread una matriz que tenga como columnas los
valores de Prewt y Postwt, y cada fila sean los valores correspondientes
para cada posición.
## [,1] [,2]
## [1,] 80.7 80.2
## [2,] 89.4 80.1
## [3,] 91.8 86.4
## [4,] 74.0 86.3
## [5,] 78.1 76.1
## [6,] 88.3 78.1
Ejercicio 7
Identificador <- c("I1","I2","I3","I4","I5","I6","I7","I8","I9","I10","I11","I12","I13","I14",
"I15","I16","I17","I18","I19","I20","I21","I22","I23","I24","I25")
Edad <- c(23,24,21,22,23,25,26,24,21,22,23,25,26,24,22,21,25,26,24,21,25,27,26,22,29)
Sexo <-c(1,2,1,1,1,2,2,2,1,2,1,2,2,2,1,1,1,2,2,2,1,2,1,1,2) #1 para mujeres y 2 para hombres
Peso <- c(76.5,81.2,79.3,59.5,67.3,78.6,67.9,100.2,97.8,56.4,65.4,67.5,87.4,99.7,87.6,93.4,65.4,73.7,85.1,61.2,54.8,103.4,65.8,71.7,85.0)
Alt <- c(165,154,178,165,164,175,182,165,178,165,158,183,184,164,189,167,182,179,165,158,183,184,189,166,175) #altura en cm
Fuma <- c("SÍ","NO","SÍ","SÍ","NO","NO","NO","SÍ","SÍ","SÍ","NO","NO","SÍ","SÍ","SÍ","SÍ","NO","NO","SÍ","SÍ","SÍ","NO","SÍ","NO","SÍ")
Trat_Pulmon <- data.frame(Identificador,Edad,Sexo,Peso,Alt,Fuma)
head(Trat_Pulmon)## Identificador Edad Sexo Peso Alt Fuma
## 1 I1 23 1 76.5 165 SÍ
## 2 I2 24 2 81.2 154 NO
## 3 I3 21 1 79.3 178 SÍ
## 4 I4 22 1 59.5 165 SÍ
## 5 I5 23 1 67.3 164 NO
## 6 I6 25 2 78.6 175 NO
- Seleccionad los registros con edad > 22.
## Identificador Edad Sexo Peso Alt Fuma
## 1 I1 23 1 76.5 165 SÍ
## 2 I2 24 2 81.2 154 NO
## 5 I5 23 1 67.3 164 NO
## 6 I6 25 2 78.6 175 NO
## 7 I7 26 2 67.9 182 NO
## 8 I8 24 2 100.2 165 SÍ
## 11 I11 23 1 65.4 158 NO
## 12 I12 25 2 67.5 183 NO
## 13 I13 26 2 87.4 184 SÍ
## 14 I14 24 2 99.7 164 SÍ
## 17 I17 25 1 65.4 182 NO
## 18 I18 26 2 73.7 179 NO
## 19 I19 24 2 85.1 165 SÍ
## 21 I21 25 1 54.8 183 SÍ
## 22 I22 27 2 103.4 184 NO
## 23 I23 26 1 65.8 189 SÍ
## 25 I25 29 2 85.0 175 SÍ
- Seleccionad el elemento 3 de la columna 4 del conjunto de datos (contando el identificador).
## [1] 79.3
- Usad el comando
subset()para seleccionar todas las filas que tienen una edad menor que 27 años y sin incluir la columna Alt.
## Identificador Edad Sexo Peso Fuma
## 1 I1 23 1 76.5 SÍ
## 2 I2 24 2 81.2 NO
## 3 I3 21 1 79.3 SÍ
## 4 I4 22 1 59.5 SÍ
## 5 I5 23 1 67.3 NO
## 6 I6 25 2 78.6 NO
## 7 I7 26 2 67.9 NO
## 8 I8 24 2 100.2 SÍ
## 9 I9 21 1 97.8 SÍ
## 10 I10 22 2 56.4 SÍ
## 11 I11 23 1 65.4 NO
## 12 I12 25 2 67.5 NO
## 13 I13 26 2 87.4 SÍ
## 14 I14 24 2 99.7 SÍ
## 15 I15 22 1 87.6 SÍ
## 16 I16 21 1 93.4 SÍ
## 17 I17 25 1 65.4 NO
## 18 I18 26 2 73.7 NO
## 19 I19 24 2 85.1 SÍ
## 20 I20 21 2 61.2 SÍ
## 21 I21 25 1 54.8 SÍ
## 23 I23 26 1 65.8 SÍ
## 24 I24 22 1 71.7 NO
Ejercicio 8
Incorporad el dataset ChickWeight que contiene
información sobre el peso de 578 pollitos en gramos (weight), el tiempo
desde la medición al nacer (Time), una variable identificadora de cada
pollito (Chick) a partir del rango de peso y una variable factor con el
tipo de dieta experimental que cada pollito recibió (Diet).
- Incorporad el conjunto de datos ChickWeight del paquete datasets a vuestro entorno de trabajo.
- Generad un gráfico de dispersión de la variable weight.
- Cread un diagrama de caja con la variable Time.
Ejercicio 9
A partir del conjunto de datos anorexia del paquete
MASS, cread otro data frame que se llame anorexia_treat_df formado por
Treat y por un vector nuevo calculado a partir de la diferencia
Prewt-Postwt. De esta manera, nos quedará un data frame que contenga el
tipo de tratamiento y el valor del peso ganado o perdido después de
haber realizado el tratamiento.
Treat <- anorexia$Treat
difpeso <- anorexia$Prewt - anorexia$Postwt
anorexia_treat_df <- data.frame(Treat,difpeso)
head(anorexia_treat_df)## Treat difpeso
## 1 Cont 0.5
## 2 Cont 9.3
## 3 Cont 5.4
## 4 Cont -12.3
## 5 Cont 2.0
## 6 Cont 10.2
Seleccionad aquellos individuos que han ganado peso después del tratamiento y cread un nuevo conjunto llamado anorexia_treat_C_df que contenga solo los datos de aquellos que han seguido el tratamiento «Cont» y que han ganado peso después del tratamiento.
anorexia_treat_C_df <- subset(anorexia_treat_df, Treat=="Cont" & difpeso>0)
head(anorexia_treat_C_df)## Treat difpeso
## 1 Cont 0.5
## 2 Cont 9.3
## 3 Cont 5.4
## 5 Cont 2.0
## 6 Cont 10.2
## 7 Cont 12.2
Caso práctico
Resolved los siguientes apartados:
- Cread un conjunto de datos inventado con R. Debe contener treinta observaciones (quince para hombres y quince para mujeres) para seis variables con estas características:
| Variable | Nombre | Características |
|---|---|---|
| Identificador | Id | carácter |
| Edad | Edad | numérica |
| Genero | Gene | 2 valores 1 = mujer, 2 = hombre |
| Tratamiento | Trat | Factor. Tres tipos de tratamiento (A, B y C) |
| Peso | Peso | numérica (en kg) |
| Estatura | Alt | numérica (en cm) |
set.seed(25) #Queremos reproducir siempre los mismos valores
ID <- paste("ID", 1:30, sep="")
Edad <- sample(15:80,30)
Gene <- sample(c(rep(1, 15), rep(2, 15)))
Trat<- sample(c("A","B","C"),30,replace=TRUE)
Peso <- sample(48:105,30)
Alt <- sample(135:195,30)
df_pacientes <- data.frame(ID,Edad,Gene,Trat,Peso,Alt)
df_pacientes$Trat <- as.factor(df_pacientes$Trat)- Buscad información de vuestro conjunto de datos y de vuestras variables.
## ID Edad Gene Trat Peso
## Length:30 Min. :15.00 Min. :1.0 A: 9 Min. : 51.00
## Class :character 1st Qu.:32.00 1st Qu.:1.0 B:11 1st Qu.: 64.25
## Mode :character Median :50.50 Median :1.5 C:10 Median : 76.50
## Mean :49.13 Mean :1.5 Mean : 76.33
## 3rd Qu.:66.75 3rd Qu.:2.0 3rd Qu.: 86.75
## Max. :79.00 Max. :2.0 Max. :105.00
## Alt
## Min. :137.0
## 1st Qu.:155.0
## Median :167.5
## Mean :167.0
## 3rd Qu.:178.0
## Max. :195.0
- Cread una nueva variable a partir de alguna de las que tengamos. Por ejemplo, podéis calcular el IMC (IMC = peso (kg)/ [estatura (m)]2 e incluid la nueva variable en el conjunto de datos.
## ID Edad Gene Trat Peso Alt IMC
## 1 ID1 21 1 B 80 173 26.72993
## 2 ID2 38 1 B 76 165 27.91552
## 3 ID3 74 1 C 69 137 36.76275
## 4 ID4 39 1 B 71 153 30.33021
## 5 ID5 63 1 A 98 186 28.32697
## 6 ID6 22 2 C 72 166 26.12861
- Cread dos dataframes diferenciados para hombres y mujeres con dos nombres diferentes: Df_Hombres y Df_Mujeres.
## ID Edad Gene Trat Peso Alt IMC
## 1 ID1 21 1 B 80 173 26.72993
## 2 ID2 38 1 B 76 165 27.91552
## 3 ID3 74 1 C 69 137 36.76275
## 4 ID4 39 1 B 71 153 30.33021
## 5 ID5 63 1 A 98 186 28.32697
## 9 ID9 68 1 A 87 159 34.41320
## 17 ID17 79 1 B 83 192 22.51519
## 18 ID18 57 1 C 103 145 48.98930
## 20 ID20 48 1 A 54 161 20.83253
## 23 ID23 66 1 B 86 146 40.34528
## 25 ID25 19 1 B 52 154 21.92613
## 26 ID26 67 1 C 64 149 28.82753
## 27 ID27 51 1 B 77 174 25.43269
## 28 ID28 44 1 C 53 171 18.12524
## 30 ID30 76 1 B 62 181 18.92494
## ID Edad Gene Trat Peso Alt IMC
## 6 ID6 22 2 C 72 166 26.12861
## 7 ID7 55 2 A 78 160 30.46875
## 8 ID8 40 2 B 75 175 24.48980
## 10 ID10 30 2 C 84 179 26.21641
## 11 ID11 50 2 C 56 195 14.72715
## 12 ID12 15 2 B 65 143 31.78640
## 13 ID13 75 2 A 89 191 24.39626
## 14 ID14 17 2 C 94 193 25.23558
## 15 ID15 78 2 A 51 162 19.43301
## 16 ID16 58 2 B 82 169 28.71048
## 19 ID19 61 2 C 74 158 29.64269
## 21 ID21 77 2 C 93 190 25.76177
## 22 ID22 25 2 A 105 170 36.33218
## 24 ID24 43 2 A 99 172 33.46403
## 29 ID29 18 2 A 58 142 28.76413
- Combinad de nuevo los dos ficheros anteriores y cread el primero de nuevo con el comando rbind().
## ID Edad Gene Trat Peso Alt IMC
## 1 ID1 21 1 B 80 173 26.72993
## 2 ID2 38 1 B 76 165 27.91552
## 3 ID3 74 1 C 69 137 36.76275
## 4 ID4 39 1 B 71 153 30.33021
## 5 ID5 63 1 A 98 186 28.32697
## 9 ID9 68 1 A 87 159 34.41320
## 17 ID17 79 1 B 83 192 22.51519
## 18 ID18 57 1 C 103 145 48.98930
## 20 ID20 48 1 A 54 161 20.83253
## 23 ID23 66 1 B 86 146 40.34528
## 25 ID25 19 1 B 52 154 21.92613
## 26 ID26 67 1 C 64 149 28.82753
## 27 ID27 51 1 B 77 174 25.43269
## 28 ID28 44 1 C 53 171 18.12524
## 30 ID30 76 1 B 62 181 18.92494
## 6 ID6 22 2 C 72 166 26.12861
## 7 ID7 55 2 A 78 160 30.46875
## 8 ID8 40 2 B 75 175 24.48980
## 10 ID10 30 2 C 84 179 26.21641
## 11 ID11 50 2 C 56 195 14.72715
## 12 ID12 15 2 B 65 143 31.78640
## 13 ID13 75 2 A 89 191 24.39626
## 14 ID14 17 2 C 94 193 25.23558
## 15 ID15 78 2 A 51 162 19.43301
## 16 ID16 58 2 B 82 169 28.71048
## 19 ID19 61 2 C 74 158 29.64269
## 21 ID21 77 2 C 93 190 25.76177
## 22 ID22 25 2 A 105 170 36.33218
## 24 ID24 43 2 A 99 172 33.46403
## 29 ID29 18 2 A 58 142 28.76413