Capítulo 10 La familia apply

La familia de funciones apply es usada para aplicar una función a cada elemento de una estructura de datos. En particular, es usada para aplicar funciones en matrices, data frames, arrays y listas.

Con esta familia de funciones podemos automatizar tareas complejas usando poca líneas de código y es una de las características distintivas de R como lenguaje de programación.

La familia de funciones apply es una expresión de los rasgos del paradigma funcional de programación presentes en R. Sobre esto no profundizaremos demasiado, pero se refiere saber que en R las funciones son “ciudadanos de primera”, con la misma importancia que los objetos, y por lo tanto, operamos en ellas.

La familia de funciones apply no sólo recibe datos como argumentos, también recibe funciones.

10.0.1 Un recordatorio sobre vectorización

Para entender más fácilmente el uso de la familia apply, recordemos la vectorización de operaciones.

Hay operaciones que, si las aplicamos a un vector, son aplicadas a todos sus elementos.

mi_vector <- 1:10

mi_vector
##  [1]  1  2  3  4  5  6  7  8  9 10
mi_vector ^ 2
##  [1]   1   4   9  16  25  36  49  64  81 100

Lo anterior es, generalmente, preferible a escribir una operación para cada elemento o a usar un bucle for, como se describió en el capítulo sobre estructuras de control.

Como todo lo que ocurre en R es una función, podemos decir que al vectorizar estamos aplicando una función a cada elemento de un vector. La familia de funciones apply nos permite implementar esto en estructuras de datos distintas a los vectores.

10.0.2 Las funciones de la familia apply

La familia apply esta formada por las siguientes funciones:

  • apply()
  • eapply()
  • lapply()
  • mapply()
  • rapply()
  • sapply()
  • tapply()
  • vapply()

Es una familia numerosa y esta variedad de funciones se debe a que varias de ellas tienen aplicaciones sumamente específicas.

Todas las funciones de esta familia tienen una característica en común: reciben como argumentos a un objeto y al menos una función.

Hasta ahora, todas las funciones que hemos usado han recibido como argumentos estructuras de datos, sean vectores, data frames o de otro tipo. Las funciones de la familia apply tienen la particularidad que pueden recibir a otra función como un argumento. Lo anterior puede sonar confuso, pero es más bien intuitivo al verlo implementado.

Nosotros trabajaremos con las funciones más generales y de uso común de esta familia:

  • apply()
  • lapply()

Estas dos funciones nos permitirán solucionar casi todos los problemas a los que nos encontremos. Además, conociendo su uso, las demás funciones de la familia apply serán relativamente fáciles de entender.