# Código que utilicé en la clase del 21/9, sobre lapply y sapply data("airquality") # Para calcular la media de cada columna resultado <- lapply(airquality, mean) print(resultado) # Lo mismo, pero ignorando los NA's resultadoS <- sapply(airquality, mean, na.rm=TRUE) resultadoS print(resultadoS) # Esta función normaliza un vector al rango 0-1 normaliza <- function(x){ (x-min(x, na.rm=TRUE)) / (max(x, na.rm=TRUE)-min(x, na.rm=TRUE)) } # Aquí usamos la función anterior con lapply para normalizar # cada una de las columnas de un data.frame res <- as.data.frame(lapply(airquality, normaliza)) print(head(res)) # El siguiente código es para estandarizar en lugar de normalizar estandariza <- function(x){ (x-mean(x, na.rm=TRUE)) / sd(x, na.rm=TRUE) } resS <- as.data.frame(lapply(airquality, estandariza)) print(head(resS)) # El siguiente código normaliza las columnas de un data.frame # pero sólo aquellas que no son constantes. Para las que son # constantes, devuelve un vector de unos. normalizaBis <- function(x){ if((max(x, na.rm=TRUE)-min(x, na.rm=TRUE))==0){ rep(1, length(x)) } else { (x-min(x, na.rm=TRUE)) / (max(x, na.rm=TRUE)-min(x, na.rm=TRUE)) } } midataframe <- cbind(airquality, constante=4) res <- as.data.frame(lapply(midataframe, normalizaBis)) print(head(res)) # El siguiente código normaliza sólo las columnas numéricas normalizaTris <- function(x){ if(is.numeric(x)){ if((max(x, na.rm=TRUE)-min(x, na.rm=TRUE))==0){ rep(1, length(x)) } else { (x-min(x, na.rm=TRUE)) / (max(x, na.rm=TRUE)-min(x, na.rm=TRUE)) } } else { return(x) } } midataframe <- cbind(airquality, constante=4, cadena="pepe") res <- as.data.frame(lapply(midataframe, normalizaTris)) print(head(res))