3.9 La función tapply

La función tapply aplica (de ahí parte de su nombre) una función a un vector en los subvectores que define otro vector máscara:

tapply(iris$Petal.Length, iris$Species, mean)
##     setosa versicolor  virginica 
##      1.462      4.260      5.552

En el ejemplo anterior, tapply aplica la función mean a un vector, la longitud del pétalo, pero de especie en especie. Responde por tanto a la pregunta de cuál es la media de la longitud del pétalo por especie. Es una operación similar a la conocida en SQL como group by.

Calcula el valor medio de la temperatura en cada mes de Nueva York (usando airquality).

tapply es una de las llamadas funciones de orden superior porque acepta como argumento otra función (mean en el caso anterior). Las funciones a las que llaman tanto tapply como el resto de las funciones de orden superior pueden tener parámetros adicionales. Por ejemplo, si el vector sobre el que se quiere calcular la media contiene NA, el resultado es NA. Pero mean admite el parámetro opcional na.rm = TRUE para ignorar los nulos. Para aplicar no la función mean sino mean con la opción na.rm = TRUE hay que cambiar la llamada a tapply así:

tapply(iris$Petal.Length, iris$Species, mean, na.rm = TRUE)

Eso hace lo mismo (pero es mucho más simple) que:

foo <- function(x) mean(x, na.rm = TRUE)
tapply(iris$Petal.Length, iris$Species, foo)

La particularidad de tapply y otras funciones de orden superior similares de R es que aquellas opciones adicionales que se incluyen en la llamada a tapply después de la función que aplican pasan a esta última.

Calcula el valor medio del ozono en cada mes de Nueva York (usando airquality).

Usando mtcars, calcula la potencia mediana según el número de cilindros del vehículo.