#Ejercicio 1:
A partir de los datos siguientes de los pacientes de un hospital: Cread un data frame con los datos de los pacientes anteriores y:
Filtrad los pacientes con niveles de colesterol por encima de 200.
Calculad las estadísticas descriptivas de los niveles de colesterol de los pacientes.
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Nombre <- c("Paciente1", "Paciente2", "Paciente3", "Paciente4", "Paciente5")
Edad <- c(45, 32, 28, 55, 40)
Genero <- c("Femenino", "Masculino", "Femenino", "Masculino", "Femenino")
PA <- c("120/80", "130/85", "110/70", "140/90", "125/75")
Colesterol <- c(180, 200, 150, 220, 190)
Paciente <- data.frame( Nombre, Edad, Genero, PA, Colesterol)
Paciente
col_sup_200<- Paciente %>%
filter(Colesterol > 200)
col_sup_200
estadisticos_col_alto <- col_sup_200 %>%
summarize(
media_colesterol = mean(Colesterol),
desviación_estándar_colesterol = sd(Colesterol),
máximo_colesterol = max(Colesterol),
mínimo_colesterol = min(Colesterol))
estadisticos_col_alto
#Ejercicio 2:
El porcentaje de grasa corporal óptima de un individuo depende de la edad y del género. Por ello, en general: Porcentaje masa corporal.
Edad (años) Mujer (%) Hombre (%) 10-30 20-26 12-18 31-40 21-27 13-19 41-50 22-28 14-20 51-60 22-30 16-20 61 o más 22-31 17-21 Nota.- Estos valores pueden variar ligeramente según el origen de la publicación. (Fuente: http://nutricionymultinivel.blogspot.com/p/ tablas-de-valores-de-la-organizacion.html). Definid variables que representen la edad y el género de un individuo y, en función del valor que les asignéis, mostrad el porcentaje de masa corporal óptima que les correspondería con base en la tabla anterior.
edad<- 36
genero<- "Mujer"
tabla_de_grasa<- data.frame(c("10-30", "31-40", "41-50", "51-60", "61 o más"),
c("20 - 26", "21 - 27", "22 - 28", "22 - 30",
"22 - 31"), c("12 - 18", "13 - 19", "14 - 20",
"16 - 20", "17 - 21"))
colnames(tabla_de_grasa)<-c("Edad (años)", "Mujer (%)", "Hombre (%)")
tabla_de_grasa
if (genero == "Mujer") {
if (edad >= 10 && edad <= 30) {
porcentaje_grasa_optima <- "20 - 26"
} else if (edad >= 31 && edad <= 40) {
porcentaje_grasa_optima <- "21 - 27"
} else if (edad >= 41 && edad <= 50) {
porcentaje_grasa_optima <- "22 - 28"
} else if (edad >= 51 && edad <= 60) {
porcentaje_grasa_optima <- "22 - 30"
} else if (edad >= 61) {
porcentaje_grasa_optima <- "22 - 31%"
} else {
porcentaje_grasa_optima <- "Porcentaje superior al nivel optimo"
}
} else if (genero == "Hombre") {
if (edad >= 10 && edad <= 30) {
porcentaje_grasa_optima <- "12 - 18"
} else if (edad >= 31 && edad <= 40) {
porcentaje_grasa_optima <- "13 - 19"
} else if (edad >= 41 && edad <= 50) {
porcentaje_grasa_optima <- "14 - 20"
} else if (edad >= 51 && edad <= 60) {
porcentaje_grasa_optima <- "16 - 20"
} else if (edad >= 61) {
porcentaje_grasa_optima <- "17 - 21"
} else {
porcentaje_grasa_optima <- "Porcentaje superior al nivel optimo"
}
} else {
porcentaje_grasa_optima <- "Género no válido"
}
cat("El porcentaje de grasa optimo para una", genero, "de", edad, "años, es:",
porcentaje_grasa_optima, "\n")
## El porcentaje de grasa optimo para una Mujer de 36 años, es: 21 - 27
#Ejercicio 3: A partir del conjunto de datos anorexia del paquete MASS, calculad el porcentaje de pacientes que han realizado cada tipo de tratamiento.
library(MASS)
##
## Adjuntando el paquete: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
head(anorexia)
cont<-0
cbt<-0
ft<-0
tratamientos<-c(anorexia$Treat)
for (i in 1:length(tratamientos)) {
if (anorexia$Treat[i]=="Cont")
cont<-cont+1
else
if (anorexia$Treat[i]=="CBT")
cbt<-cbt+1
else
ft<-ft+1
}
porcentaje_tto_cont<-round((cont/length(tratamientos)*100),3)
porcentaje_tto_cbt<- round((cbt/length(tratamientos)*100),3)
porcentaje_tto_ft<- round((ft/length(tratamientos)*100),3)
cat("El porcentaje de pacientes que han realizado el tratamiento cont es: ",
porcentaje_tto_cont, "cbt: ", porcentaje_tto_cbt, "y ft: ",
porcentaje_tto_ft,"\n")
## El porcentaje de pacientes que han realizado el tratamiento cont es: 36.111 cbt: 40.278 y ft: 23.611
#Ejercicio 4: A partir del conjunto de datos birthwt del paquete MASS, calculad cuántos recién nacidos con un peso inferior a 2.600 gramos corresponden a madres menores de veinte años y fumadoras.
head(birthwt)
bajo_peso_fuma<-0
bwt<-c(birthwt$bwt)
for (i in 1:length(bwt)) {
if (birthwt$bwt[i]<2600)
if (birthwt$age[i]<20)
if (birthwt$smoke[i]==1)
bajo_peso_fuma<-bajo_peso_fuma+1
}
bajo_peso_fuma
## [1] 7
#Ejercicio 5:
Supongamos que queremos generar un registro médico de pacientes que incluya información como nombre, edad, diagnóstico y niveles de glucosa en sangre, con los siguientes datos de pacientes:
Definid una función llamada crear_registro_médico que tome los cuatro vectores anteriorescomo argumentos (nombres, edades, diagnósticos y glucosa) y cree un data frame que representa un registro médico de pacientes. Finalmente, el resultado por pantalla deberá ser un data frame que contiene información detallada sobre cada paciente, incluyendo su nombre, edad, diagnóstico y niveles de glucosa en sangre.
nombres <- c("Ana", "Luis", "María", "Carlos", "Elena")
edades <- c(45, 32, 28, 55, 40)
diagnosticos <- c("Diabetes", "Hipertensión", "Sano", "Hipertensión", "Asma")
glucosa <- c(125, 140, 95, 160, 110)
# funcion para crear registro medico
crear_registro_medico <-function(nombres, edades, diagnosticos, glucosa){
registro<- data.frame(
Nombre = nombres,
Edad= edades,
Diagnóstico = diagnosticos,
Glucosa= glucosa
)
return(registro)
}
registro_pacientes<- crear_registro_medico(nombres, edades, diagnosticos,
glucosa)
registro_pacientes
#Ejercicio 6: A partir del conjunto de datos birthwt del paquete MASS, guardad en un vector los pesos de los recién nacidos cuyas madres tengan menos de 20 años. Calculad la media y representad gráficamente este vector (por ejemplo, un diagrama de puntos).
data(birthwt)
fn_bwt<-function() {
peso_RN <-c() # vector vacío
j<-1 # contador
for(i in 1:length(birthwt$bwt)) {
if (birthwt$age[i] <20) {
peso_RN[j]<-birthwt$bwt[i]
j<-j+1
}
}
return(peso_RN)
}
pesos_menores_20 <- fn_bwt()
pesos_menores_20
## [1] 2523 2600 2637 2722 2733 2769 2769 2778 2906 2920 2920 2977 3062 3062 3062
## [16] 3090 3175 3175 3225 3225 3374 3374 3402 3572 3572 3629 3643 3651 3651 3756
## [31] 3856 3860 3884 3941 3997 4238 1885 1899 2082 2084 2125 2225 2282 2296 2353
## [46] 2381 2414 2438 2466 2495 2495
mean(pesos_menores_20)
## [1] 2973.529
plot(pesos_menores_20,
main= "Peso de recién nacido de madres menores de 20 años",
xlab="Indice del recién nacido",
ylab= "Peso",
col="lightblue")
abline(h=mean(pesos_menores_20), col= "green")
#Ejercicio 7: A partir de los ejemplos trabajados de definición de funciones, definid dos funciones, una que calcule el IMC de un individuo y otra que calcule el porcentaje de peso corporal óptimo en función de la edad y el género. En ambas funciones, es necesario definir los parámetros que correspondan.
calcular_IMC<- function(peso, altura) {
IMC<-peso/altura^2
return(IMC)
}
calcular_IMC(60, 1.56)
## [1] 24.65483
Peso_corporal_optimo<- function(edad, genero) {
if (genero == "Mujer") {
if (edad >= 10 && edad <= 30) {
porcentaje_grasa_optima <- "20 - 26"
} else if (edad >= 31 && edad <= 40) {
porcentaje_grasa_optima <- "21 - 27"
} else if (edad >= 41 && edad <= 50) {
porcentaje_grasa_optima <- "22 - 28"
} else if (edad >= 51 && edad <= 60) {
porcentaje_grasa_optima <- "22 - 30"
} else if (edad >= 61) {
porcentaje_grasa_optima <- "22 - 31"
} else {
porcentaje_grasa_optima <- "Porcentaje superior al nivel optimo"
}
} else if (genero == "Hombre") {
if (edad >= 10 && edad <= 30) {
porcentaje_grasa_optima <- "12 - 18"
} else if (edad >= 31 && edad <= 40) {
porcentaje_grasa_optima <- "13 - 19"
} else if (edad >= 41 && edad <= 50) {
porcentaje_grasa_optima <- "14 - 20"
} else if (edad >= 51 && edad <= 60) {
porcentaje_grasa_optima <- "16 - 20"
} else if (edad >= 61) {
porcentaje_grasa_optima <- "17 - 21"
} else {
porcentaje_grasa_optima <- "Porcentaje superior al nivel optimo"
}
} else {
porcentaje_grasa_optima <- "Género no válido"
return(porcentaje_grasa_optima)
}
}
Peso_corporal_optimo(36,"Mujer")
cat("El porcentaje de grasa optimo para una", genero, "de", edad, "años, es:",
porcentaje_grasa_optima, "\n")
## El porcentaje de grasa optimo para una Mujer de 36 años, es: 21 - 27
#Ejercicio 8: Si consideramos el conjunto de datos birthwt del paquete MASS, cread una función que muestre los valores de peso de los recién nacidos cuyas madres sean de raza blanca y cuyo peso esté por debajo de la media de los pesos observados.
data("birthwt")
media_peso_blancas<- function(){
bwtt<-birthwt$bwt
race<-birthwt$race
mean(bwtt)
pesos_inferiores <- c()
j<-1
for (i in 1:length(bwtt)) {
if (race[i] ==1){
if (bwtt[i] < mean(bwtt)) {
pesos_inferiores[j]<- bwtt[i]
j<- j+1
}
}
}
return(pesos_inferiores)
}
media_peso_blancas()
## [1] 2557 2594 2600 2637 2663 2665 2769 2769 2782 2821 2835 2836 2877 2906 2920
## [16] 2922 1021 1790 1818 1885 1928 1928 1936 2082 2084 2084 2100 2187 2225 2296
## [31] 2353 2353 2410 2410 2414 2424 2466 2466 2495
#Ejercicio 9: A partir del conjunto de datos Melanoma del paquete MASS que hace referencia a los datos de supervivencia de melanoma maligno, se pide resolver las siguientes cuestiones: a) Definid un vector que guarde las edades de los individuos observados y calculad la media, el máximo y el mínimo de esta distribución. b) Definid una función que recorra el conjunto de datos y muestre cuántos de los individuos observados murieron a causa del melanoma, cuántos sobrevivieron y cuántos murieron por diferentes causas. c) Definid una función que recorra el conjunto de datos y muestre la proporción de hombres y de mujeres que murieron por melanoma.
data("Melanoma")
Edades_observadas<-Melanoma$age
round(mean(Edades_observadas),2)
## [1] 52.46
max(Edades_observadas)
## [1] 95
min(Edades_observadas)
## [1] 4
Dx<-function(){
fallecidos<- 0
sobrevivientes<- 0
fallecidos_otras_causas<- 0
estado<-Melanoma$status
for (i in 1:length(Melanoma$status))
if (estado[i]==1)
fallecidos<- fallecidos +1
else if (estado[i]==2)
sobrevivientes<-sobrevivientes+1
else
fallecidos_otras_causas<-fallecidos_otras_causas+1
return(c(fallecidos, sobrevivientes, fallecidos_otras_causas))
}
Dx()
## [1] 57 134 14
prop_muertes_mela <- function() {
fallecidos <- 0
fallecidos_Mujer <- 0
fallecidos_Hombre <- 0
estado <- Melanoma$status
genero <- Melanoma$sex
for(i in 1:length(estado)) {
if(estado[i] == 1) {
fallecidos <- fallecidos + 1
if(genero[i] == 1) { # 1 = hombre
fallecidos_Hombre <- fallecidos_Hombre + 1
} else { # 0 = mujer
fallecidos_Mujer <- fallecidos_Mujer + 1
}
}
}
prop_mujer <- fallecidos_Mujer / fallecidos
prop_hombre <- fallecidos_Hombre / fallecidos
return(c(round(prop_mujer,2), round(prop_hombre,2)))
}
prop_muertes_mela()
## [1] 0.49 0.51
#Ejercicio 10: A partir del conjunto de datos anterior airquality trabajado anteriormente, resolved las siguientes consultas: 1) Mostrad la media del factor Ozone. 2) Mostrad los datos de Ozone, Solar.R y Wind de los meses (Month) 5, 6 y 7. 3) Mostrad la información anterior ordenada por Month. 4) Mostrad los datos de Wind agrupados por Month. Nota: Utilizad la sintaxis adecuada para mostrar por pantalla solamente los cinco primeros registros.
data("airquality")
head(airquality)
library(sqldf)
## Cargando paquete requerido: gsubfn
## Cargando paquete requerido: proto
## Cargando paquete requerido: RSQLite
library(RSQLite)
library(dplyr)
db<-"RSQLite"::datasetsDb()
dbListTables(db)
## [1] "BOD" "CO2" "ChickWeight" "DNase"
## [5] "Formaldehyde" "Indometh" "InsectSprays" "LifeCycleSavings"
## [9] "Loblolly" "Orange" "OrchardSprays" "PlantGrowth"
## [13] "Puromycin" "Theoph" "ToothGrowth" "USArrests"
## [17] "USJudgeRatings" "airquality" "anscombe" "attenu"
## [21] "attitude" "cars" "chickwts" "esoph"
## [25] "faithful" "freeny" "infert" "iris"
## [29] "longley" "morley" "mtcars" "npk"
## [33] "pressure" "quakes" "randu" "rock"
## [37] "sleep" "stackloss" "swiss" "trees"
## [41] "warpbreaks" "women"
AVG_Ozono<-sqldf("SELECT AVG(Ozone) FROM airquality")
AVG_Ozono
head(sqldf("SELECT Ozone,[Solar.R],Wind FROM airquality where Month IN
(5,6,7)"))
head(sqldf("SELECT Ozone,[Solar.R],Wind, Month FROM airquality where
Month IN (5,6,7) ORDER BY Month DESC"))
head(sqldf("SELECT Wind, Month FROM airquality GROUP BY Month"),5)
#Caso práctico 1.La serie de Fibonacci en las moléculas de ADN
Según las investigaciones de Mark E. Curtis, cada giro completo de la doble hélice del ADN mide 21 Angs de ancho por 34 Angs de largo; 34 y 21 son dos números consecutivos en la sucesión de Fibonacci. Por lo tanto, su cociente, 1.6190476, aproxima de cerca la Razón Áurea Phi=1.6180339… (Fuente: http://www.sacred-geometry.es/?q=es/content/phi-en-laestructura- del-adn ). Se pide: a) Implementad en R una función que, dado un valor n, muestre los valores de la serie de Fibonacci hasta ese valor determinado.
fibonacci<- function(n){
num <- c(0, 1)
for (i in 2:(n - 1)) {
num[i + 1] <- num[i] + num[i - 1]
}
return(num)
}
fibonacci(10)
## [1] 0 1 1 2 3 5 8 13 21 34
fibonacci(20)
## [1] 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
## [16] 610 987 1597 2584 4181
Si un giro completo de la doble hélice del ADN mide: 21 Å de ancho y 34 Å de largo, el n estará dado por los terminos donde aparecen estas medidas.
fibonacci(9)
## [1] 0 1 1 2 3 5 8 13 21
fibonacci(10)
## [1] 0 1 1 2 3 5 8 13 21 34
Aurea<-function(n){
valores<- fibonacci(n)
proporcion <- numeric(n-1)
for (i in 2:n) {
proporcion[i -1] <- valores[i]/ valores[i-1]
}
return(proporcion)
}
Aurea(10)
## [1] Inf 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000 1.615385
## [9] 1.619048
Aurea(11)
## [1] Inf 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000 1.615385
## [9] 1.619048 1.617647
Aurea(15)
## [1] Inf 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000 1.615385
## [9] 1.619048 1.617647 1.618182 1.617978 1.618056 1.618026
A medida que va aumentando el valor de n, más se ajusta al valor de la razón áurea.
#Caso práctico 2. Secuencias de ADN
La secuencia de ADN de un individuo contiene información genética de este. Actualmente, existen técnicas que permiten realizar esta secuenciación y aportar datos para investigar el comportamiento de diferentes tipos de organismos biológicos. (Fuente: https://es.wikipedia.org/wiki/Secuenciaci%C3%B3n_del_ADN). Se pide generar una secuencia de ADN y calcular su inverso y su complementario.
#secuencia aleatoria de ADN
ADN <- function(n) {
bases <- c("A", "T", "C", "G")
secuencia <- sample(bases, n, replace = TRUE)
return(paste(secuencia, collapse = ""))#Unir todas las letras sin espacios en una sola cadena de texto
}
sec_aleat <- ADN(8)
cat("Secuencia aleatoria original: ", sec_aleat, "\n")
## Secuencia aleatoria original: CCCGTAAT
#invertir la secuencia
Inverso_ADN <- function(secuencia) {
bases <- strsplit(secuencia, "")[[1]] # separa la cadena en letras individuales
inversa <- rev(bases) # las pone al revés
return(paste(inversa, collapse = "")) #
}
cat("Secuencia inversa: ", Inverso_ADN(sec_aleat), "\n")
## Secuencia inversa: TAATGCCC
# complementaria, cada base se reemplaza por su pareja
Complem_ADN<- function(secuencia) {
bases<- strsplit(secuencia, "")[[1]]
#aplicar la función a cada base
complementarias <- sapply(bases, function(base) {
switch(base, # reemplazar
"A" = "T",
"T" = "A",
"C" = "G",
"G" = "C")
})
return(paste(complementarias, collapse = ""))
}
cat("secuencia complementaria: ",Complem_ADN(sec_aleat),"\n")
## secuencia complementaria: GGGCATTA
#Caso práctico 3. Gestión de base de datos de pacientes
Supongamos que pretendemos gestionar la información de una base de datos de pacientes de un hospital. En principio, disponemos de dos tablas, pacientes y registros_médicos. De la tabla pacientes, disponemos de los siguientes datos: pacientes (nombre, edad, género, condición_médica) (‘Paciente1’, 45, ‘Femenino’, ‘Diabetes’), (‘Paciente2’, 32, ‘Masculino’, ‘Hipertensión’), (‘Paciente3’, 28, ‘Femenino’, ‘Sano’), (‘Paciente4’, 55, ‘Masculino’, ‘Hipertensión’), (‘Paciente5’, 40, ‘Femenino’, ‘Asma’). De la tabla registros_médicos, disponemos de los siguientes datos: registros_médicos (paciente_id, fecha, nivel_glucosa) (1, ‘2023-08-01’, 125.5), (2, ‘2023-08-01’, 140.2), (3, ‘2023-08-01’, 95.8), (4, ‘2023-08-01’, 160.6), (5, ‘2023-08-01’, 110.9). Se pide utilizar las instrucciones de acceso a bases de datos para resolver las siguientes cuestiones:
library(DBI)
library(RSQLite)
library(dplyr)
library(ggplot2)
con <- dbConnect(SQLite(), "Hospital.db") # crear conexion
pacientes <- data.frame(
nombre = c("Paciente1", "Paciente2", "Paciente3", "Paciente4", "Paciente5"),
edad = c(45, 32, 28, 55, 40),
genero = c("Femenino", "Masculino", "Femenino", "Masculino", "Femenino"),
condicion_medica = c("Diabetes", "Hipertensión", "Sano", "Hipertensión", "Asma")
)
reg_medicos <- data.frame(
paciente_id = c(1, 2, 3, 4, 5),
fecha = as.Date(c("2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01", "2023-08-01")),
nivel_glucosa = c(125.5, 140.2, 95.8, 160.6, 110.9)
)
# escribir las tablas en la base de datos
dbWriteTable(con, "pacientes", pacientes, overwrite = TRUE)
dbWriteTable(con, "reg_medicos", reg_medicos, overwrite = TRUE)
dbListTables(con)
## [1] "pacientes" "reg_medicos"
Diabetes <- dbGetQuery(con, "SELECT * FROM pacientes WHERE condicion_medica = 'Diabetes'")
print(Diabetes)
## nombre edad genero condicion_medica
## 1 Paciente1 45 Femenino Diabetes
Estadisticos_glucosa<- dbGetQuery(con, "
SELECT
AVG(nivel_glucosa) AS media,
MIN(nivel_glucosa) AS minimo,
MAX(nivel_glucosa) AS maximo
FROM reg_medicos
")
print(Estadisticos_glucosa)
## media minimo maximo
## 1 126.6 95.8 160.6
#combinar tablas
registros_HTA <- dbGetQuery(con, "SELECT r.*
FROM reg_medicos r
JOIN pacientes p ON r.paciente_id
= p.rowid
WHERE p.condicion_medica =
'Hipertensión'")
estadisticos_HTA_glucosa <- dbGetQuery(con, "SELECT AVG(nivel_glucosa) AS media_glucosa,
MAX(nivel_glucosa)
AS máximo_glucosa,
MIN(nivel_glucosa)
AS mínimo_glucosa
FROM
reg_medicos
WHERE paciente_id
IN (SELECT rowid
FROM pacientes
WHERE condicion_medica = 'Hipertensión')")
print(registros_HTA)
## paciente_id fecha nivel_glucosa
## 1 2 19570 140.2
## 2 4 19570 160.6
edad_promedio_asma <- dbGetQuery(con, "SELECT genero, AVG(edad) AS
edad_promedio
FROM pacientes
WHERE condicion_medica = 'Asma'
GROUP BY genero")
print(edad_promedio_asma)
## genero edad_promedio
## 1 Femenino 40
genero_diabetes <- dbGetQuery(con, "SELECT genero, COUNT(*) AS cantidad
FROM pacientes
WHERE condicion_medica = 'Diabetes'
GROUP BY genero")
#Crear un gráfico de barras
ggplot(genero_diabetes, aes(x = genero, y = cantidad, fill = genero)) +
geom_bar(stat = "identity") +
labs(title = "Distribución de Género en Pacientes con Diabetes", x =
"Género", y = "Cantidad") +
theme_minimal()