### 1
repositorio <- "http://carleos.epv.uniovi.es/~carleos/aireUO/dat/csv/"
## visitamos el repositorio y vemos que hay an~os desde 2010 hasta 2018
annos <- as.character(2010:2018) # as.character para etiquetas de sapply
## en las carpetas de los an~os hay desde vale001 hasta vale027
vales <- formatC(1:27, width=3, flag="0") # ceros para nombre de fichero
## descargamos los datos
descargar.csv <- function (anno, vale)
{
    fichero <- paste0("vale", vale, ".csv")
    direccion <- paste0(repositorio, anno, "/", fichero)
    resultado <- try (read.csv (direccion))
    closeAllConnections() # evita error "todas las conexiones están en uso"
    resultado
}
## simplify=FALSE para mantener la estructura de lista
datos <- sapply (annos,
                 function (anno)
                     sapply (vales,
                             function (vale)
                                 descargar.csv (anno, vale),
                             simplify=FALSE),
                 simplify=FALSE)

### 2
d <- data.frame(estacion = character(0)) # acumulador
for (anno in annos)
    for (vale in vales)
        if (class (datos.i <- datos[[anno]][[vale]]) == "data.frame")
        {
            if (nrow(d) > 0)
            {   
                d       [setdiff(names(datos.i),names(d))] <- NA
                datos.i [setdiff(names(d),names(datos.i))] <- NA
            }
            datos.i$estacion <- vale
            d <- rbind (d, datos.i)
        }
## cambiaremos caracteres a factores
cambiables <- names (which (sapply (d, is.character)))
for (v in cambiables) d[[v]] <- factor(d[[v]])

### 3
names(d) [sapply(d, function(x) length(table(x))==1)]

### 4
variables <- grep("^FL_", names(d), value=TRUE)
pdf()
for (variable in variables) barplot (table (d[[variable]]), main=variable)
dev.off()

### 5
## supondremos que no hay NA
mediana <- function (x)
{
    n <- length(x)
    if (n%%2 || n==0) # longitud impar o nula
        median(x)
    else
        median (c (Inf, x)) # otras posibilidades:
                            # -quantile(-x, .5, type=1)
                            # sort(x)[n/2+1]
}