Ir al contenido principal

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

Posit RStudio / Spark en Ubuntu 24.04

Apache Spark es " un motor de análisis unificado de código abierto para procesar datos a gran escala en clústeres " y para el área donde trabajamos es fundamental debido a que permite cargar y procesar archivos de gran tamaño. Con la reciente adqusición de un equipo de los llamados estaciones de trabajo, el sistema operativo con el que opera es un Ubuntu por lo que yo habilité un equipo viejo con un sistema operativo de casi la misma versión solo que para escritorio, no para servidor. Por ahora el sistema manda constantemente un error relacionado con el "firmware" pero por ahora las aplicaciones que he instalado casi todas han funcionado con las pruebas realizadas hasta ahora, aquí el error que muestra generalmente cuando se instalan nuevos paquetes y sus dependencias.   Se encontraron errores al procesar:  firmware-b43-installer E: Sub-process /usr/bin/dpkg returned an error code (1)  La siguiente imagen es un pequeño resumen del hardware y software donde se está...

REDATAM en Ubuntu (Linux)

 En un blog alterno, escribí sobre como migraba un "viejo" Intel i5 al sistema operativo Ubuntu en su versión más actual. Me comunique con mi gran colega Lenin de la CELADE en Chile, después de mucho tiempo, y le pedí me diera un pequeño resumen del "estado del arte" de REDATAM me dijo que todo marchaba bien, y pues ahora creo que tengo que actualizarme en contenedores pues el web server se encuentra ahí. Nos pusimos manos a la obra, el instalable desde la página no tiene ninguna extensión de archivo, asumí que era un ejecutable para Linux, no se si la página sufra ataques constantes ya que después quise volver a descargar sin éxito, la página estaba caida, sin embargo rescate el ejecutable anteriormente descargado. Últimamente primero hago y después documento, ya que con todo y mi compañero Deep,  no todo sale a la primera ni como lo dictan sus sugerencias, sobre todo en Linux y MacOS.  Por lo que, les muestro solo el resultado final de esta primera exploración, im...

El problema del gallo - otra vertiente de usar Python en RMarkdown con Posit RStudio

Cuando pensamos que ya se había cruzado el río, el buen gallo - mi amigo el Dany  Lara- no podía insertar código de Python  en un documento de RMarkdown  usando la versión de escritorio de Posit RStudio a pesar de las soluciones como instalar el Python y direccionarlo desde R con la biblioteca reticulate . Si bien se podía ejecutar código del interprete base, al querer correr usando módulos y con ello intentando instalar dichos módulos mandaba el siguiente mensaje: > py_install('matplotlib') Using virtual environment "D:/tu_usuario/Documents/.virtualenvs/r-reticulate" ... WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)'))': /simple/matplotlib/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) a...