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.