Mas sobre apply

 Una cosa importante es el poder implementar funciones propias usando apply, el investigar diversos caminos puede ser que al final el que creíamos que sería el idóneo, no lo es. Sin embargo el conocimiento queda ahí para futuras soluciones.

Vamos ahora a ver como crear nuestras propias funciones y que se ejecuten en un apply.

Tenemos el siguiente fragmento del script:

library(tidyverse)

df <- as.data.frame(read_csv("ruta/2008.csv",n_max = 100000))

df2 <- df[,c("CarrierDelay","WeatherDelay", "NASDelay", "SecurityDelay", "LateAircraftDelay")]

df_clean <- df2[complete.cases(df2),]

Una nueva función es complete.cases que elimina aquellos registros que tengan valores "ausentes" (missing - NA).

> nrow(df_clean)

[1] 19627


Podemos observar que de la muestra de 100000 registros, los que traen información son solo 19627.

media2 <- function(fila){

  return (sum(fila) / length(fila))

}

cr <- apply(df_clean, 1, mean)

cr2 <- apply(df_clean, 1, media2)

all(cr == cr2)

La función que define es media2, otra cosa diferente al artículo anterior es que para apply se omiten los parámetros (X, MARGIN y FUN). media2 recibe el renglón como parámetro y no es necesario mandarlo entre paréntesis, el código indica que ambos vectores son iguales y la función predefinida (mean) hace lo mismo que nuestra función media2.

Por último vamos a hacer un poco más compleja una función y en los casos donde se obtenga el máximo o la media se creará una lista con una etiqueta para identificar si se calculó el máximo o en su defecto la media y se tiene al menos un valor NA se manda una cadena "Contiene NA's".

funcionpropia <- function(fila){

  if(any(is.na(fila))){

    return("Contiene NA's")

  }else{

    if(all(fila)>0){

      return(list(a="Media", b=mean(fila)))

    }else{

      return(list(a="Máximo", b=max(fila)))

    }

  }

}


que_dio <- apply(df2,1,funcionpropia)


head(que_dio)

La lógica del script anterior significa que si algún valor es NA (is.na(fila)) manda la cadena "Contiene NA's", si todos los valores de la fila son mayores que 0 (all(fila))se aplica la media (que son pocos casos) y si hay ceros se saca el valor máximo de la fila, debemos notar que se manda el "dataset" original df2. Aquí una muestra del objeto: que_dio.


Debido a que es raro que haya retrasos en todas las columnas no se identifica a simple vista alguna media aritmética.

Seguimos compartiendo.

Miguel Araujo.

Comentarios

Entradas populares de este blog

Librería de REDATAM para R

Conectar bases de datos Oracle con R vía JDBC

Red 7 Admin