5.3 Las funciones lapply, sapply y split

La función lapply está estrechamente relacionada con las listas. Aunque después, en la sección de programación, la trataremos de nuevo, es conveniente familiarizarse con ella cuanto antes.

La función lapply es una función de orden superior, como tapply, que aplica una función a cada elemento de una lista o vector. Por ejemplo,

lapply(airquality[, 1:4], mean, na.rm = TRUE)

calcula la media de cada una de las cuatro primeras columnas de airquality. El argumento adicional, na.rm = TRUE, igual que como ocurría con tapply, se pasa a la función mean.

La función lapply opera sobre una lista o vector y devuelve, siempre, una lista. Está relacionada con la función sapply, que es una versión simplificada de lapply. Es decir, sapply aplica la función lapply y estudia la salida. Cuando entiende que dicha salida admite una representación menos aparatosa que una lista, la simplifica. Por ejemplo,

sapply(airquality[, 1:4], mean, na.rm = TRUE)
##      Ozone    Solar.R       Wind       Temp 
##  42.129310 185.931507   9.957516  77.882353

En el caso anterior, en lugar de una lista, como hace lapply, sapply devuelve una representación más natural: un vector de números.

Tanto lapply como sapply son maps, i.e., funciones que aplican una función a cada elemento de una lista o vector. En muchos casos habituales, no hace falta usar estas funciones porque muchas, como ya hemos visto, están vectorizadas. Por ejemplo,

sqrt(1:5)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068

Pero si sqrt no estuviese vectorizada, aún podríamos aplicársela a un vector haciendo, por ejemplo,

sapply(1:5, sqrt)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068

Obviamente, lapply y sapply permiten aplicar cualquier función, incluidas las definidas por los usuarios.

Finalmente, también es muy útil la función split, que permite partir una tabla en trozos de acuerdo con un vector que define los grupos. Por ejemplo,

tmp <- split(iris, iris$Species)

Investiga el objeto tmp: ¿qué longitud tiene? ¿qué contiene cada uno de sus componentes?

Usa las funciones lapply y sapply para mostrar la dimensión de cada una de las tablas que contiene tmp.

La función split puede servir para operar en subtablas en combinación con lapply. Sin embargo, paquetes como plyr, que introduciremos más tarde, son más prácticos para este tipo de operaciones.

Usa split para partir iris en dos subtablas al azar con el mismo número de filas.

Transformaciones como las que solicita el ejercicio anterior son comunes en ciencia de datos: partir un conjunto de datos en dos al azar para construir un modelo sobre una parte de los datos y evaluar su rendimiento sobre el complementario. El ejercicio siguiente está relacionado con una técnica similar, la de la validación cruzada, que es una alternativa más sofisticada a la anterior.

Usa split para partir iris cinco subtablas, cada una de ellas con 30 filas distintas.