EXERCICIS

EXERCICI 1.

Creeu un data frame amb les dades dels pacients anteriors y: 1. Filtreu els pacients amb nivells de colesterol per sobre de 200. 2. Calculeu les estadístiques descriptives dels nivells de colesterol dels pacients.
# Creem el data frame
pacients <- data.frame(Nom = c("Pacient 1", "Pacient 2", "Pacient 3", "Pacient 4", "Pacient 5"),
                       Gènere = c("Femení", "Masculí", "Femení", "Masculí", "Femení"),
                       Pressió_arterial = c("120/80", "130/85", "110/70", "140/90", "125/75"),
                       Colesterol = c(180, 200, 150, 220, 190))

# Filtrem els pacients amb uns nivells de colesterol per sobre de 200
pacients_colesterol <- pacients[pacients$Colesterol > 200,]

# Fem un resum estadístic de la mitjana, mediana, mínim i màxim del filtratge
summary(pacients_colesterol)
##      Nom               Gènere          Pressió_arterial     Colesterol 
##  Length:1           Length:1           Length:1           Min.   :220  
##  Class :character   Class :character   Class :character   1st Qu.:220  
##  Mode  :character   Mode  :character   Mode  :character   Median :220  
##                                                           Mean   :220  
##                                                           3rd Qu.:220  
##                                                           Max.   :220
# A l'ordre summary li falta la desviació estàndard, però al tenir només una persona, no obtindrem resultat
sd <- sd(pacients_colesterol)
## Warning in is.data.frame(x): NAs introducidos por coerción
## Warning in is.data.frame(x): NAs introducidos por coerción
## Warning in is.data.frame(x): NAs introducidos por coerción
sd
## [1] NA
EXERCICI 2.
El percentatge de greix corporal òptim d’un individu depèn de l’edat i del gènere. Per això, en general: Percentatge massa corporal. Edat (anys) Dona (%) Home (%) 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.- Aquests valors poden variar lleugerament segons l’origen de la publicació. Definiu variables que representin l’edat i el gènere d’un individu i, en funció del valor que els assigneu, mostreu el percentatge de massa corporal òptim que els correspondria segons la taula anterior
# Definim variables
genere = "Home"
edat = 23

# Establim la funció
if (genere == "Home") {
  if (edat < 10)
    greix <- "No registrat"
  else if (edat <= 30)
    greix <- "12 - 18"
  else if (edat <= 40)
    greix <- "13-19"
  else if (edat <= 50)
    greix <- "14-20"
  else if (edat <= 60)
    greix <- "16 - 20"
  else
    greix <- "17-21"
}else {
  if (edat < 10)
    greix <- "No registrat"
  else if (edat <= 30)
    greix <- "20-26"
  else if (edat <= 40)
    greix <- "21-27"
  else if (edat <= 50)
    greix <- "22-28"
  else if (edat <= 60)
    greix <- "22-30"
  else
    greix <- "22-31"
}
print(greix)
## [1] "12 - 18"
EXERCICI 3.
A partir del conjunt de dades anorexia del paquet MASS, calculeu el percentatge de pacients que han dut a terme cada tipus de tractament.
library("MASS")

# Mitjançant la funció 'table()' obtenim una taula de freqüències dels tractaments
frequencies <- table(anorexia$Treat)

# Un cop tenim les freqüències, dividim aquestes pel nombre de pacients que han passat per algun dels tres tractaments. Finalment multipliquem el resultat per 100, per obtenir el percentatge. Arrodonim a dos decimals
percentatges <- round((frequencies/length(anorexia$Treat))*100, 2)
percentatges
## 
##   CBT  Cont    FT 
## 40.28 36.11 23.61

Com es pot observar en el resultat:

· Un 40,28% dels pacients han dut a terme el tractament CBT

· Un 36,11% dels pacients han dut a terme el tractament Cont

· Un 23,61% dels pacients ho han fet amb FT

EXERCICI 4.
A partir del conjunt de dades birthwt del paquet MASS, calculeu quants nounats amb un pes inferior a 2.600 grams corresponen a mares menors de vint anys i fumadores.
library("MASS")
data("birthwt")

cont <- 0

for (i in 1:length(birthwt$bwt))
if (birthwt$bwt[i] < 2600 && birthwt$age[i] < 20 && birthwt$smoke[i] == 1) {
  cont <- cont+1
}
print(cont)
## [1] 7

En aquest cas, tenim 7 nounats nascuts amb menys de 2.600 grams, les mares dels quals son fumadores menors de 20 anys.

EXERCICI 5
Definiu una funció anomenada crear_registre_medic que agafi els quatre vectors anteriors com a arguments (noms, edats, diagnòstics i glucosa) i creï un data frame que representa un registre mèdic de pacients. Finalment, el resultat per pantalla haurà de ser un data frame que conté informació detallada sobre cada pacient, incloent el nom, edat, diagnòstic i nivells de glucosa en sang.
# Definim els vectors amb les dades
noms <- c('Anna', 'Lluis', 'Maria', 'Carles', 'Elena')
edats <- c(45, 32, 28, 55, 40)
diagnostics <- c('Diabetis', 'Hipertensió', 'Sa', 'Hipertensió', 'Asma')
glucosa <- c(125, 140, 95, 160, 110)

# Creem la funció
crear_registre_medic <- function(noms, edats, diagnostics, glucosa) {
  registre_medic <- data.frame(noms, edats, diagnostics, glucosa)
  return(registre_medic)
}

# Cridem la funció
resultats <- crear_registre_medic(noms, edats, diagnostics, glucosa)

print(resultats)
##     noms edats diagnostics glucosa
## 1   Anna    45    Diabetis     125
## 2  Lluis    32 Hipertensió     140
## 3  Maria    28          Sa      95
## 4 Carles    55 Hipertensió     160
## 5  Elena    40        Asma     110
EXERCICI 6
A partir del conjunt de dades birthwt del paquet MASS, deseu en un vector els pesos dels nounats les mares dels quals tinguin menys de vint anys. Calculeu la mitjana i representeu gràficament aquest vector (per exemple, un diagrama de punts).
library(MASS)
data("birthwt")

pesos <- birthwt$bwt[birthwt$age < 20]
mitjana <- mean(pesos)
mitjana
## [1] 2973.529
plot(pesos, xlab='Index', ylab='Pes (en grams)', main='Distribució de pesos en nounats amb mares menors de 20 anys')

EXERCICI 7
A partir dels exemples treballats de definició de funcions, definiu dues funcions, una que calculi l’IMC d’un individu i una altra que calculi el percentatge de pes corporal òptim en funció de l’edat i el gènere. En totes dues funcions, cal definir els paràmetres que corresponguin.
# Comencem amb la funció que calcula l'IMC
# Paràmetres: pes(kg) i altura(m)
calcula_IMC <- function(pes, altura){
  imc <- pes / (altura^2)
  return(round(imc, 2))
}

calcula_IMC(70, 1.80)
## [1] 21.6
# Fem la funció del percentatge de greix corporal òptim
PGCO <- function(genere, edat){
  if (genere == "Home") {
  if (edat < 10)
    greix <- "No registrat"
  else if (edat <= 30)
    greix <- "12 - 18%"
  else if (edat <= 40)
    greix <- "13-19%"
  else if (edat <= 50)
    greix <- "14-20%"
  else if (edat <= 60)
    greix <- "16 - 20%"
  else
    greix <- "17-21%"
} else if (genere == "Dona") {
  if (edat < 10)
    greix <- "No registrat"
  else if (edat <= 30)
    greix <- "20-26%"
  else if (edat <= 40)
    greix <- "21-27%"
  else if (edat <= 50)
    greix <- "22-28%"
  else if (edat <= 60)
    greix <- "22-30%"
  else
    greix <- "22-31%"
}
  else {
    greix <- "Gènere no trobat"
  }
  return(greix)
}
  
PGCO("Dona", 45)
## [1] "22-28%"
PGCO("Alien", 280)
## [1] "Gènere no trobat"
EXERCICI 8
Si considerem el conjunt de dades birthwt del paquet MASS, creeu una funció que mostri els valors de pes dels nounats les mares dels quals siguin de raça blanca i el pes de les quals estigui per sota de la mitjana dels pesos observats.
library(MASS)
data("birthwt")

# Creem la funció en que filtrarem per raça (1 simbolitza la raça blanca, font: https://stats4stem.weebly.com/r-birthwt-data.html) i per pes.
mostra_pes <- function(nounat){
  mitjana <- mean(birthwt$bwt)
  resultat <- nounat[nounat$race == 1 & nounat$bwt < mitjana,]
  return(resultat)
  }
  
mostra_pes(birthwt)
##     low age lwt race smoke ptl ht ui ftv  bwt
## 87    0  20 105    1     1   0  0  0   1 2557
## 88    0  21 108    1     1   0  0  1   2 2594
## 89    0  18 107    1     1   0  0  1   0 2600
## 92    0  22 118    1     0   0  0  0   1 2637
## 94    0  29 123    1     1   0  0  0   1 2663
## 95    0  26 113    1     1   0  0  0   0 2665
## 100   0  18 100    1     1   0  0  0   0 2769
## 101   0  18 100    1     1   0  0  0   0 2769
## 103   0  25 118    1     1   0  0  0   3 2782
## 105   0  28 120    1     1   0  0  0   1 2821
## 107   0  31 100    1     0   0  0  1   3 2835
## 108   0  36 202    1     0   0  0  0   1 2836
## 112   0  28 167    1     0   0  0  0   0 2877
## 113   0  17 122    1     1   0  0  0   0 2906
## 114   0  29 150    1     0   0  0  0   2 2920
## 125   0  27 124    1     1   0  0  0   0 2922
## 10    1  29 130    1     0   0  0  1   2 1021
## 20    1  21 165    1     1   0  1  0   1 1790
## 22    1  32 105    1     1   0  0  0   0 1818
## 23    1  19  91    1     1   2  0  1   0 1885
## 26    1  25  92    1     1   0  0  0   0 1928
## 27    1  20 150    1     1   0  0  0   2 1928
## 29    1  24 155    1     1   1  0  0   0 1936
## 33    1  19 102    1     0   0  0  0   2 2082
## 34    1  19 112    1     1   0  0  1   0 2084
## 35    1  26 117    1     1   1  0  0   0 2084
## 36    1  24 138    1     0   0  0  0   0 2100
## 42    1  22 130    1     1   1  0  1   1 2187
## 45    1  17 110    1     1   0  0  0   0 2225
## 51    1  20 121    1     1   1  0  1   0 2296
## 56    1  31 102    1     1   1  0  0   1 2353
## 57    1  15 110    1     0   0  0  0   0 2353
## 65    1  30 142    1     1   1  0  0   0 2410
## 67    1  22 130    1     1   0  0  0   1 2410
## 68    1  17 120    1     1   0  0  0   3 2414
## 69    1  23 110    1     1   1  0  0   0 2424
## 77    1  26 190    1     1   0  0  0   0 2466
## 79    1  28  95    1     1   0  0  0   2 2466
## 84    1  21 130    1     1   0  1  0   3 2495
EXERCICI 9
A partir del conjunt de dades Melanoma del paquet MASS que fa referència a les dades de supervivència de melanoma maligne, es demana resoldre les qüestions següents: a) Definiu un vector que desi les edats dels individus observats i calculeu la mitjana, el màxim i el mínim d’aquesta distribució. b) Definiu una funció que recorri el conjunt de dades i mostri quants dels individus observats van morir a causa del melanoma, quants van sobreviure i quants van morir per diferents causes. c) Definiu una funció que recorri el conjunt de dades i mostri la proporció d’homes i de dones que van morir per melanoma.
library(MASS)
data("Melanoma")

# a)
edat <- c(Melanoma$age)

# Mitjançant summary veiem que el valor mínim és de 4 anys, el màxim és de 85 anys, i la mitjana és de 52,46 anys.
summary(edat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    4.00   42.00   54.00   52.46   65.00   95.00
# b) En aquest cas utilitzarem la columna 'status' en que 1 indica que el pacient va morir per melanoma, 2 indica que segueix viu, i 3 que va morir per altres causes
estat_pacient <- function(estat) {
  melanoma <- 0
  viu <- 0
  causes_ext <- 0
  estat <- Melanoma$status
  for (i in 1:length(Melanoma$status))
  if (estat[i] == 1)
    melanoma <- melanoma +1
  else if (estat[i] == 2)
    viu <- viu +1
  else if (estat[i] == 3)
    causes_ext <- causes_ext +1
  return(c(melanoma, viu, causes_ext))
}
print(estat_pacient())
## [1]  57 134  14
# Tenim 57 pacients que van morir degut al Melanoma, 134 pacients vius, i 14 pacients que van morir per causes externes diferents. 

# c) 
mort_mela <- function(mela){
  morts <- mela[mela$status == 1,]
  
  m_homes <- sum(morts$sex == 1)
  m_dones <- sum(morts$sex == 0)
  m_totals <- nrow(morts)
  
  p_homes <- (m_homes/m_totals) * 100
  p_dones <- (m_dones/m_totals) * 100
  
  resultat <- c("Proporció Homes" = p_homes, "Proporció Dones" = p_dones)
  
  return(resultat)
}

print(mort_mela(Melanoma))
## Proporció Homes Proporció Dones 
##        50.87719        49.12281
EXERCICI 10
A partir del conjunt de dades anterior airquality treballat anteriorment, resoleu les consultes següents:
1) Mostreu la mitjana del factor Ozone.
2) Mostreu les dades d’Ozone, Solar.R i Wind dels mesos (Month) 5, 6 i 7.
3) Mostreu la informació anterior ordenada per Month.
4) Mostreu les dades de Wind agrupades per Month.
# El treballaré com si accedissim a dades d'una base de dades, per tant, carreguem els paquets
library(sqldf)
## Cargando paquete requerido: gsubfn
## Cargando paquete requerido: proto
## Cargando paquete requerido: RSQLite
library(RSQLite)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# 1) Calculem la mitjana d'Ozone
sqldf("SELECT AVG(Ozone) FROM airquality")
##   AVG(Ozone)
## 1   42.12931
# 2) Mostrem les dades pels mesos 5, 6 i 7
sqldf("SELECT Ozone, 'Solar.R', Wind from airquality
      WHERE month IN (5, 6, 7)")
##    Ozone 'Solar.R' Wind
## 1     41   Solar.R  7.4
## 2     36   Solar.R  8.0
## 3     12   Solar.R 12.6
## 4     18   Solar.R 11.5
## 5     NA   Solar.R 14.3
## 6     28   Solar.R 14.9
## 7     23   Solar.R  8.6
## 8     19   Solar.R 13.8
## 9      8   Solar.R 20.1
## 10    NA   Solar.R  8.6
## 11     7   Solar.R  6.9
## 12    16   Solar.R  9.7
## 13    11   Solar.R  9.2
## 14    14   Solar.R 10.9
## 15    18   Solar.R 13.2
## 16    14   Solar.R 11.5
## 17    34   Solar.R 12.0
## 18     6   Solar.R 18.4
## 19    30   Solar.R 11.5
## 20    11   Solar.R  9.7
## 21     1   Solar.R  9.7
## 22    11   Solar.R 16.6
## 23     4   Solar.R  9.7
## 24    32   Solar.R 12.0
## 25    NA   Solar.R 16.6
## 26    NA   Solar.R 14.9
## 27    NA   Solar.R  8.0
## 28    23   Solar.R 12.0
## 29    45   Solar.R 14.9
## 30   115   Solar.R  5.7
## 31    37   Solar.R  7.4
## 32    NA   Solar.R  8.6
## 33    NA   Solar.R  9.7
## 34    NA   Solar.R 16.1
## 35    NA   Solar.R  9.2
## 36    NA   Solar.R  8.6
## 37    NA   Solar.R 14.3
## 38    29   Solar.R  9.7
## 39    NA   Solar.R  6.9
## 40    71   Solar.R 13.8
## 41    39   Solar.R 11.5
## 42    NA   Solar.R 10.9
## 43    NA   Solar.R  9.2
## 44    23   Solar.R  8.0
## 45    NA   Solar.R 13.8
## 46    NA   Solar.R 11.5
## 47    21   Solar.R 14.9
## 48    37   Solar.R 20.7
## 49    20   Solar.R  9.2
## 50    12   Solar.R 11.5
## 51    13   Solar.R 10.3
## 52    NA   Solar.R  6.3
## 53    NA   Solar.R  1.7
## 54    NA   Solar.R  4.6
## 55    NA   Solar.R  6.3
## 56    NA   Solar.R  8.0
## 57    NA   Solar.R  8.0
## 58    NA   Solar.R 10.3
## 59    NA   Solar.R 11.5
## 60    NA   Solar.R 14.9
## 61    NA   Solar.R  8.0
## 62   135   Solar.R  4.1
## 63    49   Solar.R  9.2
## 64    32   Solar.R  9.2
## 65    NA   Solar.R 10.9
## 66    64   Solar.R  4.6
## 67    40   Solar.R 10.9
## 68    77   Solar.R  5.1
## 69    97   Solar.R  6.3
## 70    97   Solar.R  5.7
## 71    85   Solar.R  7.4
## 72    NA   Solar.R  8.6
## 73    10   Solar.R 14.3
## 74    27   Solar.R 14.9
## 75    NA   Solar.R 14.9
## 76     7   Solar.R 14.3
## 77    48   Solar.R  6.9
## 78    35   Solar.R 10.3
## 79    61   Solar.R  6.3
## 80    79   Solar.R  5.1
## 81    63   Solar.R 11.5
## 82    16   Solar.R  6.9
## 83    NA   Solar.R  9.7
## 84    NA   Solar.R 11.5
## 85    80   Solar.R  8.6
## 86   108   Solar.R  8.0
## 87    20   Solar.R  8.6
## 88    52   Solar.R 12.0
## 89    82   Solar.R  7.4
## 90    50   Solar.R  7.4
## 91    64   Solar.R  7.4
## 92    59   Solar.R  9.2
# 3) Ordenem per Month
sqldf("SELECT Ozone, 'Solar.R', Wind, Month from airquality
      WHERE month IN (5, 6, 7)
      ORDER BY month DESC") #L'ordenem descendentment perquè per defecte, en l'apartat 2) ja estaven ordenats per mesos
##    Ozone 'Solar.R' Wind Month
## 1    135   Solar.R  4.1     7
## 2     49   Solar.R  9.2     7
## 3     32   Solar.R  9.2     7
## 4     NA   Solar.R 10.9     7
## 5     64   Solar.R  4.6     7
## 6     40   Solar.R 10.9     7
## 7     77   Solar.R  5.1     7
## 8     97   Solar.R  6.3     7
## 9     97   Solar.R  5.7     7
## 10    85   Solar.R  7.4     7
## 11    NA   Solar.R  8.6     7
## 12    10   Solar.R 14.3     7
## 13    27   Solar.R 14.9     7
## 14    NA   Solar.R 14.9     7
## 15     7   Solar.R 14.3     7
## 16    48   Solar.R  6.9     7
## 17    35   Solar.R 10.3     7
## 18    61   Solar.R  6.3     7
## 19    79   Solar.R  5.1     7
## 20    63   Solar.R 11.5     7
## 21    16   Solar.R  6.9     7
## 22    NA   Solar.R  9.7     7
## 23    NA   Solar.R 11.5     7
## 24    80   Solar.R  8.6     7
## 25   108   Solar.R  8.0     7
## 26    20   Solar.R  8.6     7
## 27    52   Solar.R 12.0     7
## 28    82   Solar.R  7.4     7
## 29    50   Solar.R  7.4     7
## 30    64   Solar.R  7.4     7
## 31    59   Solar.R  9.2     7
## 32    NA   Solar.R  8.6     6
## 33    NA   Solar.R  9.7     6
## 34    NA   Solar.R 16.1     6
## 35    NA   Solar.R  9.2     6
## 36    NA   Solar.R  8.6     6
## 37    NA   Solar.R 14.3     6
## 38    29   Solar.R  9.7     6
## 39    NA   Solar.R  6.9     6
## 40    71   Solar.R 13.8     6
## 41    39   Solar.R 11.5     6
## 42    NA   Solar.R 10.9     6
## 43    NA   Solar.R  9.2     6
## 44    23   Solar.R  8.0     6
## 45    NA   Solar.R 13.8     6
## 46    NA   Solar.R 11.5     6
## 47    21   Solar.R 14.9     6
## 48    37   Solar.R 20.7     6
## 49    20   Solar.R  9.2     6
## 50    12   Solar.R 11.5     6
## 51    13   Solar.R 10.3     6
## 52    NA   Solar.R  6.3     6
## 53    NA   Solar.R  1.7     6
## 54    NA   Solar.R  4.6     6
## 55    NA   Solar.R  6.3     6
## 56    NA   Solar.R  8.0     6
## 57    NA   Solar.R  8.0     6
## 58    NA   Solar.R 10.3     6
## 59    NA   Solar.R 11.5     6
## 60    NA   Solar.R 14.9     6
## 61    NA   Solar.R  8.0     6
## 62    41   Solar.R  7.4     5
## 63    36   Solar.R  8.0     5
## 64    12   Solar.R 12.6     5
## 65    18   Solar.R 11.5     5
## 66    NA   Solar.R 14.3     5
## 67    28   Solar.R 14.9     5
## 68    23   Solar.R  8.6     5
## 69    19   Solar.R 13.8     5
## 70     8   Solar.R 20.1     5
## 71    NA   Solar.R  8.6     5
## 72     7   Solar.R  6.9     5
## 73    16   Solar.R  9.7     5
## 74    11   Solar.R  9.2     5
## 75    14   Solar.R 10.9     5
## 76    18   Solar.R 13.2     5
## 77    14   Solar.R 11.5     5
## 78    34   Solar.R 12.0     5
## 79     6   Solar.R 18.4     5
## 80    30   Solar.R 11.5     5
## 81    11   Solar.R  9.7     5
## 82     1   Solar.R  9.7     5
## 83    11   Solar.R 16.6     5
## 84     4   Solar.R  9.7     5
## 85    32   Solar.R 12.0     5
## 86    NA   Solar.R 16.6     5
## 87    NA   Solar.R 14.9     5
## 88    NA   Solar.R  8.0     5
## 89    23   Solar.R 12.0     5
## 90    45   Solar.R 14.9     5
## 91   115   Solar.R  5.7     5
## 92    37   Solar.R  7.4     5
# 4) Mostrem Wind agrupat per Month
sqldf("SELECT Wind, Month from airquality
      GROUP BY Month")
##   Wind Month
## 1  7.4     5
## 2  8.6     6
## 3  4.1     7
## 4  6.9     8
## 5  6.9     9

CASOS PRÀCTICS

CAS PRÀCTIC 1
Es demana: a) Implementeu en R una funció que, donat un valor n, mostri els valors de la sèrie de Fibonacci fins a aquest valor determinat.
b) Per a quins valors de n localitzem, en la sèrie de Fibonacci, les mesures de la doble hèlix de la molècula d’ADN?
c) Complementeu el codi de l’apartat a) afegint-hi una nova funció (o les instruccions que corresponguin en la funció creada anteriorment) de manera que, per a un determinat valor n, mostri les proporcions successives dels valors de la sèrie de Fibonacci. A partir de quin valor de n, aquesta proporció es va aproximant a la Raó Àuria?
# a) creem la funció
fibonacci <- function(n){
  # Creem un seguro per nombres no permesos en la funció, per evitar que peti
  if (n == 1) return (0)
  if (n == 2) return(c(0,1))
  if (n < 0) return ("Introdueix un valor positiu")
  
  num <- c(0,1) # Els dos primers nombres de Fibonacci, la funció necessita dos nombres per començar a calcular
  for (i in 3:n){ # El bucle ha de començar per la posició 3, perque ja hem definit 0 i 1
    num[i] <- num[i-1] + num[i-2]
  }
  return(num)
}
fibonacci(12)
##  [1]  0  1  1  2  3  5  8 13 21 34 55 89
# b) Veiem que en el la prova per l'apartat a) apareixen ambdós valors, 21 i 34, específicament en les posicions:
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
# c) 
fibonacci_v2 <- function(n){
  # al no poder dividir per 0, n ha de ser major o igual a 2:
  if (n<2) return ("Introdueix un valor superior o igual a 2")
  valor <- fibonacci(n)
  auria <- numeric(n)
  for (i in 2:n){
    auria[i] <- valor[i]/valor[i-1]
  }
  return(auria)
}
fibonacci_v2(20)
##  [1] 0.000000      Inf 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000
##  [9] 1.615385 1.619048 1.617647 1.618182 1.617978 1.618056 1.618026 1.618037
## [17] 1.618033 1.618034 1.618034 1.618034
# Com podem veure en els resultats, a n=14, el valor és de 1.618056, que és el primer valor que més s'assembla a la Raó Àuria, però a major n, més s'acosta el valor a la Raó
CAS PRÀCTIC 2
Es demana generar una seqüència d’ADN i calcular ne l’invers i el complementari.
# Primer de tot, desenvolupem una funció que generi una seqüència a l'atzar mitjançant 'sample()'
generar_adn <- function(n){
  bases <- c("A", "C", "T", "G")
  seq <- sample(bases, n, replace = TRUE)
  return(paste(seq, collapse = "")) # Retornem el vector unificat en un sol string
}

# Generem la funció per calcular l'invers
invers_adn <- function(seq){
  bases_ind <- strsplit(seq, split ="")[[1]] # Primer obtenim les bases individuals dividint l'string
  invers <- rev(bases_ind) # A partir de les bases, generem l'ordre revers
  return(paste(invers, collapse = ""))
}

# Generem la funció pel complementari
compl_adn <- function(seq){
  compl <- chartr("ATGC", "TACG", seq)
  return(compl)
}

prova <- generar_adn(35)

prova_inv <- invers_adn(prova)

prova_compl <- compl_adn(prova)

cat("Seqüència", prova,'\n',
    "Inversa", prova_inv, '\n',
    "Complementaria", prova_compl)
## Seqüència AGAAACCCGCGCTACGCCTTCGAAGGTGATCCTAT 
##  Inversa TATCCTAGTGGAAGCTTCCGCATCGCGCCCAAAGA 
##  Complementaria TCTTTGGGCGCGATGCGGAAGCTTCCACTAGGATA
CAS PRÀCTIC 3
Es demana utilitzar les instruccions d’accés a les bases de dades per resoldre les qüestions següents:
1) Creeu la base de dades (Hospital), les taules i els registres corresponents i la connexió des d’R.
2) Mostreu pacients amb una condició mèdica específica (per exemple, diabetis).
3) Calculeu estadístiques descriptives dels nivells de glucosa en sang.
4) Obtingueu els registres mèdics de pacients amb hipertensió i les seves estadístiques de glucosa.
5) Calculeu l’edat mitjana de pacients amb asma per gènere.
6) Creeu un gràfic de barres per mostrar la distribució de gènere en pacients amb diabetis.
library(ggplot2)
library(RSQLite)
library(dplyr)

# 1)

# Creem una connexió amb la bdd
con <- dbConnect(SQLite(), dbname = "hospital.db")

# Inserim les dades en taules, primer en pacients
dbExecute(con, "DROP TABLE IF EXISTS pacients")
## [1] 0
dbExecute(con, "DROP TABLE IF EXISTS registres_medics")
## [1] 0
dbExecute(con, "CREATE TABLE pacients(
          nom TEXT,
          edat INTEGER,
          genere TEXT,
          condicio_medica TEXT)")
## [1] 0
dbExecute(con, "INSERT INTO pacients (nom, edat, genere, condicio_medica) VALUES
          ('Pacient1',  45, 'Femeni',   'Diabetis'),
          ('Pacient2',  32, 'Masculi', 'Hipertensio'),
          ('Pacient3',  28, 'Femeni',   'Sa'),
          ('Pacient4',  55, 'Masculi',  'Hipertensio'),
          ('Pacient5',  40, 'Femeni',   'Asma')")
## [1] 5
# I ara en registres_medics
dbExecute(con, "CREATE TABLE registres_medics(
          pacient_id INTEGER,
          data TEXT,
          nivell_glucosa FLOAT)")
## [1] 0
dbExecute(con, "INSERT INTO registres_medics (pacient_id, data, nivell_glucosa) VALUES
(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)
")
## [1] 5
# 2)

diabetics <- dbGetQuery(con, "SELECT * FROM pacients WHERE condicio_medica = 'Diabetis'")
print(diabetics)
##        nom edat genere condicio_medica
## 1 Pacient1   45 Femeni        Diabetis
# 3)
stats <- dbGetQuery(con, "SELECT
                    AVG(nivell_glucosa) AS mitjana,
                    MIN(nivell_glucosa) AS minim,
                    MAX(nivell_glucosa) AS maxim
                    FROM registres_medics")
print(stats)
##   mitjana minim maxim
## 1   126.6  95.8 160.6
# 4) Com la informació està en dues taules separades, hem d'unir-les mitjançant JOIN
query_hiper <- "
SELECT p.nom, p.condicio_medica, r.data, r.nivell_glucosa
FROM pacients p
JOIN registres_medics r ON p.rowid = r.pacient_id
WHERE p.condicio_medica = 'Hipertensio'"

hipertensos <- dbGetQuery(con, query_hiper)
print(hipertensos)
##        nom condicio_medica       data nivell_glucosa
## 1 Pacient2     Hipertensio 2023-08-01          140.2
## 2 Pacient4     Hipertensio 2023-08-01          160.6
# 5) 
mitjanes_asma <- dbGetQuery(con, "SELECT genere, AVG(edat) AS edat_mitjana FROM pacients WHERE condicio_medica = 'Asma' GROUP BY genere")
print(mitjanes_asma)
##   genere edat_mitjana
## 1 Femeni           40
# 6)
genere_diabetis <- dbGetQuery(con, "SELECT genere, COUNT(*) AS quantitat 
FROM pacients 
WHERE condicio_medica = 'Diabetis' 
GROUP BY genere")

# Fem el gràfic amb ggplot2
ggplot(genere_diabetis, aes(x = genere, y = quantitat, fill = genere)) +    
geom_col() +    
labs(title = "Distribució de Gènere en Pacients amb Diabetis", x = 
"Gènere", y = "Quantitat")