Ejercicios: Fundamentos de programación y acceso a base de datos en R

#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: 1. Filtrad los pacientes con niveles de colesterol por encima de 200. 2. Calculad las estadísticas descriptivas de los niveles de colesterol de los pacientes.

#Vectores con los datos
nombre<-c("Paciente1", "Paciente2", "Paciente3", "Paciente4", "Paciente5")
edad<-c(45, 32, 28, 55, 40)
genero<-c("Femenino", "Masculino", "Femenino", "Masculino", "Femenino")
presion<-c("120/80", "130/85", "110/70", "140/90", "125/75")
colesterol<-c(180, 200, 150, 220, 190)
#Crear dataframe
datos <- data.frame(
  Nombre = nombre,
  Edad = edad,
  Género = genero,
  "Presión arterial" = presion,
  Colesterol = colesterol
)
print(datos)
##      Nombre Edad    Género Presión.arterial Colesterol
## 1 Paciente1   45  Femenino           120/80        180
## 2 Paciente2   32 Masculino           130/85        200
## 3 Paciente3   28  Femenino           110/70        150
## 4 Paciente4   55 Masculino           140/90        220
## 5 Paciente5   40  Femenino           125/75        190
#Generar un subset e imprimir
pacientes200<-subset(datos, colesterol > 200)
print(pacientes200)
##      Nombre Edad    Género Presión.arterial Colesterol
## 4 Paciente4   55 Masculino           140/90        220
#Resumen estadístico
summary(colesterol)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     150     180     190     188     200     220

#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.

#Valores
sexo="Hombre"
edad=24
#Condicionales
if(sexo=="Mujer") {
  if(edad<10)
    mc_opt<-"No registrado"
  else
  if(edad>=10|edad<=30)
    mc_opt<-"20-26"
  else
  if(edad>=31|edad<=40)
    mc_opt<-"21-27"
  else
  if(edad>=41|edad<=50)
    mc_opt<-"22-28" 
  else
  if(edad>=51|edad<=60)
    mc_opt<-"22-30"
  else
  if(edad>=61)
    mc_opt<-"22-31"
} else {
  if(edad<10)
    mc_opt<-"No registrado"
  else
  if(edad>=10|edad<=30)
    mc_opt<-"12-18"
  else
  if(edad>=31|edad<=40)
    mc_opt<-"13-19"
  else
  if(edad>=41|edad<=50)
    mc_opt<-"14-20" 
  else
  if(edad>=51|edad<=60)
    mc_opt<-"16-20"
  else
  if(edad>=61)
    mc_opt<-"17-21"  
}
print(mc_opt)
## [1] "12-18"

#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)
#Importar datos
data<-anorexia
#Generar contadores a 0
cbt_c<-0
cont_c<-0
ft_c<-0
#Bucle que vaya 1 por 1 contando cada categoría
for(i in data$Treat) {
  if(i=="CBT") {
    cbt_c<-cbt_c+1
  } else if (i=="Cont") {
    cont_c<-cont_c+1
  } else if (i=="FT")
    ft_c<-ft_c+1
  }
#Suma de dinvidiuos
suma<-cbt_c+cont_c+ft_c
#Valores en %
p_cbt_c<-100*(cbt_c/suma)
p_cont_c<-100*(cont_c/suma)
p_ft_c<-100*(ft_c/suma)
cat("CBT:", p_cbt_c,"%, Cont: ",p_cont_c,"%, FT :",p_ft_c, "%")
## CBT: 40.27778 %, Cont:  36.11111 %, FT : 23.61111 %

#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.

data2<-birthwt
#Vectores con solo bwt
bwt<-c(data2$bwt)
#Contador a 0
n_madres<-0
#Bucle con condiciones
for(i in 1:length(bwt))
  if(data2$bwt[i]<2600)
  if(data2$age[i]<20)
  if(data2$smoke[i]==1)
    n_madres<-n_madres+1
n_madres
## [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 anteriores como 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.

#Vectores con datos
nombres <- c("Ana", "Luis", "María", "Carlos", "Elena")
edades <- c(45, 32, 28, 55, 40)
diagnósticos <- c("Diabetes", "Hipertensión", "Sano", "Hipertensión", "Asma")
glucosa<- c(125, 140, 95, 160, 110)
#Crear dataframe
crear_registro_médico<-data.frame(
  Nombre=nombres,
  Edad=edades,
  Diagnóstico=diagnósticos,
  Glucosa=glucosa
)
print(crear_registro_médico)
##   Nombre Edad  Diagnóstico Glucosa
## 1    Ana   45     Diabetes     125
## 2   Luis   32 Hipertensión     140
## 3  María   28         Sano      95
## 4 Carlos   55 Hipertensión     160
## 5  Elena   40         Asma     110

#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).

#subset, media y gráfico
data21<-subset(data2, age<20)
mean(data21$bwt)
## [1] 2973.529
plot(data21$age, data21$bwt)

#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.

#Función IMC
calcular_imc<-function(peso, altura) {
  imc=peso/(altura**2)
  return(imc)
}
peso=65
altura=1.7
mi_imc<-calcular_imc(peso, altura)
mi_imc
## [1] 22.49135
#Función grasa corporal usando clasificador del ejercicio 2
grasa_corporal_optima<-function(edad, genero)
  if(genero=="Mujer") {
  if(edad<10)
    mc_opt<-"No registrado"
  else
  if(edad>=10|edad<=30)
    mc_opt<-"20-26"
  else
  if(edad>=31|edad<=40)
    mc_opt<-"21-27"
  else
  if(edad>=41|edad<=50)
    mc_opt<-"22-28" 
  else
  if(edad>=51|edad<=60)
    mc_opt<-"22-30"
  else
  if(edad>=61)
    mc_opt<-"22-31"
} else {
  if(edad<10)
    mc_opt<-"No registrado"
  else
  if(edad>=10|edad<=30)
    mc_opt<-"12-18"
  else
  if(edad>=31|edad<=40)
    mc_opt<-"13-19"
  else
  if(edad>=41|edad<=50)
    mc_opt<-"14-20" 
  else
  if(edad>=51|edad<=60)
    mc_opt<-"16-20"
  else
  if(edad>=61)
    mc_opt<-"17-21"  
}
edad=25
genero="Hombre"
peso_id<-grasa_corporal_optima(edad, genero)
peso_id
## [1] "12-18"

#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.

#usando vectores generados en el ejercicio 4
data2<-birthwt
#Vectores con solo bwt
bwt<-c(data2$bwt)
#Bucle con condiciones
for(i in 1:length(bwt))
  if(data2$race[i]==1)
  if(data2$bwt[i]<mean(data2$bwt))
    print(data2$bwt[i])
## [1] 2557
## [1] 2594
## [1] 2600
## [1] 2637
## [1] 2663
## [1] 2665
## [1] 2769
## [1] 2769
## [1] 2782
## [1] 2821
## [1] 2835
## [1] 2836
## [1] 2877
## [1] 2906
## [1] 2920
## [1] 2922
## [1] 1021
## [1] 1790
## [1] 1818
## [1] 1885
## [1] 1928
## [1] 1928
## [1] 1936
## [1] 2082
## [1] 2084
## [1] 2084
## [1] 2100
## [1] 2187
## [1] 2225
## [1] 2296
## [1] 2353
## [1] 2353
## [1] 2410
## [1] 2410
## [1] 2414
## [1] 2424
## [1] 2466
## [1] 2466
## [1] 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.

melanoma<-Melanoma
#Apartado a
melanoma_edad<-c(melanoma$age)
mean(melanoma_edad)
## [1] 52.46341
max(melanoma_edad)
## [1] 95
min(melanoma_edad)
## [1] 4
#Apartado b
estado_actual<-function() {
muerto_melanoma<-0
vivos<-0
muerto_otra_causa<-0
estado<-melanoma$status
for(i in 1:length(melanoma$status))
  if(estado[i]==1)
    muerto_melanoma<-muerto_melanoma+1
  else if (estado[i]==2)
    vivos<-vivos+1
  else if (estado[i]==3)
    muerto_otra_causa<-muerto_otra_causa+1
  return(c(muerto_melanoma,vivos,muerto_otra_causa))
}
print(estado_actual())
## [1]  57 134  14
#Apartado c
melanoma_sexo<-function() {
hombres_m<-0
mujeres_m<-0
m_melanoma<-subset(melanoma, status==1)
sexo<-m_melanoma$sex
for(i in 1:length(sexo))
  if(sexo[i]==0)
    mujeres_m<-mujeres_m+1
  else if (sexo[i]==1) 
    hombres_m<-hombres_m+1
  muertes_m <- nrow(m_melanoma)
  prop_h<-hombres_m/muertes_m
  prop_m<-mujeres_m/muertes_m
  return(c(prop_h,prop_m))
  }
print(melanoma_sexo())
## [1] 0.5087719 0.4912281

#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.

library(sqldf)
## Loading required package: gsubfn
## Loading required package: proto
## Loading required package: RSQLite
library(RSQLite)
library(dplyr)
## 
## Attaching package: '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
db<-"RSQLite"::datasetsDb()
dbReadTable(db, "airquality")
##     Ozone Solar.R Wind Temp Month Day
## 1      41     190  7.4   67     5   1
## 2      36     118  8.0   72     5   2
## 3      12     149 12.6   74     5   3
## 4      18     313 11.5   62     5   4
## 5      NA      NA 14.3   56     5   5
## 6      28      NA 14.9   66     5   6
## 7      23     299  8.6   65     5   7
## 8      19      99 13.8   59     5   8
## 9       8      19 20.1   61     5   9
## 10     NA     194  8.6   69     5  10
## 11      7      NA  6.9   74     5  11
## 12     16     256  9.7   69     5  12
## 13     11     290  9.2   66     5  13
## 14     14     274 10.9   68     5  14
## 15     18      65 13.2   58     5  15
## 16     14     334 11.5   64     5  16
## 17     34     307 12.0   66     5  17
## 18      6      78 18.4   57     5  18
## 19     30     322 11.5   68     5  19
## 20     11      44  9.7   62     5  20
## 21      1       8  9.7   59     5  21
## 22     11     320 16.6   73     5  22
## 23      4      25  9.7   61     5  23
## 24     32      92 12.0   61     5  24
## 25     NA      66 16.6   57     5  25
## 26     NA     266 14.9   58     5  26
## 27     NA      NA  8.0   57     5  27
## 28     23      13 12.0   67     5  28
## 29     45     252 14.9   81     5  29
## 30    115     223  5.7   79     5  30
## 31     37     279  7.4   76     5  31
## 32     NA     286  8.6   78     6   1
## 33     NA     287  9.7   74     6   2
## 34     NA     242 16.1   67     6   3
## 35     NA     186  9.2   84     6   4
## 36     NA     220  8.6   85     6   5
## 37     NA     264 14.3   79     6   6
## 38     29     127  9.7   82     6   7
## 39     NA     273  6.9   87     6   8
## 40     71     291 13.8   90     6   9
## 41     39     323 11.5   87     6  10
## 42     NA     259 10.9   93     6  11
## 43     NA     250  9.2   92     6  12
## 44     23     148  8.0   82     6  13
## 45     NA     332 13.8   80     6  14
## 46     NA     322 11.5   79     6  15
## 47     21     191 14.9   77     6  16
## 48     37     284 20.7   72     6  17
## 49     20      37  9.2   65     6  18
## 50     12     120 11.5   73     6  19
## 51     13     137 10.3   76     6  20
## 52     NA     150  6.3   77     6  21
## 53     NA      59  1.7   76     6  22
## 54     NA      91  4.6   76     6  23
## 55     NA     250  6.3   76     6  24
## 56     NA     135  8.0   75     6  25
## 57     NA     127  8.0   78     6  26
## 58     NA      47 10.3   73     6  27
## 59     NA      98 11.5   80     6  28
## 60     NA      31 14.9   77     6  29
## 61     NA     138  8.0   83     6  30
## 62    135     269  4.1   84     7   1
## 63     49     248  9.2   85     7   2
## 64     32     236  9.2   81     7   3
## 65     NA     101 10.9   84     7   4
## 66     64     175  4.6   83     7   5
## 67     40     314 10.9   83     7   6
## 68     77     276  5.1   88     7   7
## 69     97     267  6.3   92     7   8
## 70     97     272  5.7   92     7   9
## 71     85     175  7.4   89     7  10
## 72     NA     139  8.6   82     7  11
## 73     10     264 14.3   73     7  12
## 74     27     175 14.9   81     7  13
## 75     NA     291 14.9   91     7  14
## 76      7      48 14.3   80     7  15
## 77     48     260  6.9   81     7  16
## 78     35     274 10.3   82     7  17
## 79     61     285  6.3   84     7  18
## 80     79     187  5.1   87     7  19
## 81     63     220 11.5   85     7  20
## 82     16       7  6.9   74     7  21
## 83     NA     258  9.7   81     7  22
## 84     NA     295 11.5   82     7  23
## 85     80     294  8.6   86     7  24
## 86    108     223  8.0   85     7  25
## 87     20      81  8.6   82     7  26
## 88     52      82 12.0   86     7  27
## 89     82     213  7.4   88     7  28
## 90     50     275  7.4   86     7  29
## 91     64     253  7.4   83     7  30
## 92     59     254  9.2   81     7  31
## 93     39      83  6.9   81     8   1
## 94      9      24 13.8   81     8   2
## 95     16      77  7.4   82     8   3
## 96     78      NA  6.9   86     8   4
## 97     35      NA  7.4   85     8   5
## 98     66      NA  4.6   87     8   6
## 99    122     255  4.0   89     8   7
## 100    89     229 10.3   90     8   8
## 101   110     207  8.0   90     8   9
## 102    NA     222  8.6   92     8  10
## 103    NA     137 11.5   86     8  11
## 104    44     192 11.5   86     8  12
## 105    28     273 11.5   82     8  13
## 106    65     157  9.7   80     8  14
## 107    NA      64 11.5   79     8  15
## 108    22      71 10.3   77     8  16
## 109    59      51  6.3   79     8  17
## 110    23     115  7.4   76     8  18
## 111    31     244 10.9   78     8  19
## 112    44     190 10.3   78     8  20
## 113    21     259 15.5   77     8  21
## 114     9      36 14.3   72     8  22
## 115    NA     255 12.6   75     8  23
## 116    45     212  9.7   79     8  24
## 117   168     238  3.4   81     8  25
## 118    73     215  8.0   86     8  26
## 119    NA     153  5.7   88     8  27
## 120    76     203  9.7   97     8  28
## 121   118     225  2.3   94     8  29
## 122    84     237  6.3   96     8  30
## 123    85     188  6.3   94     8  31
## 124    96     167  6.9   91     9   1
## 125    78     197  5.1   92     9   2
## 126    73     183  2.8   93     9   3
## 127    91     189  4.6   93     9   4
## 128    47      95  7.4   87     9   5
## 129    32      92 15.5   84     9   6
## 130    20     252 10.9   80     9   7
## 131    23     220 10.3   78     9   8
## 132    21     230 10.9   75     9   9
## 133    24     259  9.7   73     9  10
## 134    44     236 14.9   81     9  11
## 135    21     259 15.5   76     9  12
## 136    28     238  6.3   77     9  13
## 137     9      24 10.9   71     9  14
## 138    13     112 11.5   71     9  15
## 139    46     237  6.9   78     9  16
## 140    18     224 13.8   67     9  17
## 141    13      27 10.3   76     9  18
## 142    24     238 10.3   68     9  19
## 143    16     201  8.0   82     9  20
## 144    13     238 12.6   64     9  21
## 145    23      14  9.2   71     9  22
## 146    36     139 10.3   81     9  23
## 147     7      49 10.3   69     9  24
## 148    14      20 16.6   63     9  25
## 149    30     193  6.9   70     9  26
## 150    NA     145 13.2   77     9  27
## 151    14     191 14.3   75     9  28
## 152    18     131  8.0   76     9  29
## 153    20     223 11.5   68     9  30
colnames(airquality)
## [1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day"
#Apartado 1)
sqldf("SELECT AVG(Ozone) FROM airquality")
##   AVG(Ozone)
## 1   42.12931
#Apartado 2
sqldf("SELECT Ozone, [Solar.R], Wind FROM airquality where Month in (5,6,7)")
##    Ozone Solar.R Wind
## 1     41     190  7.4
## 2     36     118  8.0
## 3     12     149 12.6
## 4     18     313 11.5
## 5     NA      NA 14.3
## 6     28      NA 14.9
## 7     23     299  8.6
## 8     19      99 13.8
## 9      8      19 20.1
## 10    NA     194  8.6
## 11     7      NA  6.9
## 12    16     256  9.7
## 13    11     290  9.2
## 14    14     274 10.9
## 15    18      65 13.2
## 16    14     334 11.5
## 17    34     307 12.0
## 18     6      78 18.4
## 19    30     322 11.5
## 20    11      44  9.7
## 21     1       8  9.7
## 22    11     320 16.6
## 23     4      25  9.7
## 24    32      92 12.0
## 25    NA      66 16.6
## 26    NA     266 14.9
## 27    NA      NA  8.0
## 28    23      13 12.0
## 29    45     252 14.9
## 30   115     223  5.7
## 31    37     279  7.4
## 32    NA     286  8.6
## 33    NA     287  9.7
## 34    NA     242 16.1
## 35    NA     186  9.2
## 36    NA     220  8.6
## 37    NA     264 14.3
## 38    29     127  9.7
## 39    NA     273  6.9
## 40    71     291 13.8
## 41    39     323 11.5
## 42    NA     259 10.9
## 43    NA     250  9.2
## 44    23     148  8.0
## 45    NA     332 13.8
## 46    NA     322 11.5
## 47    21     191 14.9
## 48    37     284 20.7
## 49    20      37  9.2
## 50    12     120 11.5
## 51    13     137 10.3
## 52    NA     150  6.3
## 53    NA      59  1.7
## 54    NA      91  4.6
## 55    NA     250  6.3
## 56    NA     135  8.0
## 57    NA     127  8.0
## 58    NA      47 10.3
## 59    NA      98 11.5
## 60    NA      31 14.9
## 61    NA     138  8.0
## 62   135     269  4.1
## 63    49     248  9.2
## 64    32     236  9.2
## 65    NA     101 10.9
## 66    64     175  4.6
## 67    40     314 10.9
## 68    77     276  5.1
## 69    97     267  6.3
## 70    97     272  5.7
## 71    85     175  7.4
## 72    NA     139  8.6
## 73    10     264 14.3
## 74    27     175 14.9
## 75    NA     291 14.9
## 76     7      48 14.3
## 77    48     260  6.9
## 78    35     274 10.3
## 79    61     285  6.3
## 80    79     187  5.1
## 81    63     220 11.5
## 82    16       7  6.9
## 83    NA     258  9.7
## 84    NA     295 11.5
## 85    80     294  8.6
## 86   108     223  8.0
## 87    20      81  8.6
## 88    52      82 12.0
## 89    82     213  7.4
## 90    50     275  7.4
## 91    64     253  7.4
## 92    59     254  9.2
#Apartado 3
sqldf("SELECT Ozone, [Solar.R], Wind FROM airquality where Month in (5,6,7) ORDER BY Month")
##    Ozone Solar.R Wind
## 1     41     190  7.4
## 2     36     118  8.0
## 3     12     149 12.6
## 4     18     313 11.5
## 5     NA      NA 14.3
## 6     28      NA 14.9
## 7     23     299  8.6
## 8     19      99 13.8
## 9      8      19 20.1
## 10    NA     194  8.6
## 11     7      NA  6.9
## 12    16     256  9.7
## 13    11     290  9.2
## 14    14     274 10.9
## 15    18      65 13.2
## 16    14     334 11.5
## 17    34     307 12.0
## 18     6      78 18.4
## 19    30     322 11.5
## 20    11      44  9.7
## 21     1       8  9.7
## 22    11     320 16.6
## 23     4      25  9.7
## 24    32      92 12.0
## 25    NA      66 16.6
## 26    NA     266 14.9
## 27    NA      NA  8.0
## 28    23      13 12.0
## 29    45     252 14.9
## 30   115     223  5.7
## 31    37     279  7.4
## 32    NA     286  8.6
## 33    NA     287  9.7
## 34    NA     242 16.1
## 35    NA     186  9.2
## 36    NA     220  8.6
## 37    NA     264 14.3
## 38    29     127  9.7
## 39    NA     273  6.9
## 40    71     291 13.8
## 41    39     323 11.5
## 42    NA     259 10.9
## 43    NA     250  9.2
## 44    23     148  8.0
## 45    NA     332 13.8
## 46    NA     322 11.5
## 47    21     191 14.9
## 48    37     284 20.7
## 49    20      37  9.2
## 50    12     120 11.5
## 51    13     137 10.3
## 52    NA     150  6.3
## 53    NA      59  1.7
## 54    NA      91  4.6
## 55    NA     250  6.3
## 56    NA     135  8.0
## 57    NA     127  8.0
## 58    NA      47 10.3
## 59    NA      98 11.5
## 60    NA      31 14.9
## 61    NA     138  8.0
## 62   135     269  4.1
## 63    49     248  9.2
## 64    32     236  9.2
## 65    NA     101 10.9
## 66    64     175  4.6
## 67    40     314 10.9
## 68    77     276  5.1
## 69    97     267  6.3
## 70    97     272  5.7
## 71    85     175  7.4
## 72    NA     139  8.6
## 73    10     264 14.3
## 74    27     175 14.9
## 75    NA     291 14.9
## 76     7      48 14.3
## 77    48     260  6.9
## 78    35     274 10.3
## 79    61     285  6.3
## 80    79     187  5.1
## 81    63     220 11.5
## 82    16       7  6.9
## 83    NA     258  9.7
## 84    NA     295 11.5
## 85    80     294  8.6
## 86   108     223  8.0
## 87    20      81  8.6
## 88    52      82 12.0
## 89    82     213  7.4
## 90    50     275  7.4
## 91    64     253  7.4
## 92    59     254  9.2
#Apartado 4
sqldf("SELECT Month, SUM(Wind) AS Total_Wind FROM airquality GROUP BY Month LIMIT 5")
##   Month Total_Wind
## 1     5      360.3
## 2     6      308.0
## 3     7      277.2
## 4     8      272.6
## 5     9      305.4
dbDisconnect(db)