En esta segunda parte de la serie de post sobre la familia de funciones apply le toca el turno la función tapply()
. A diferencia de la función apply()
tratada en el primer post, la función tapply()
se usa frecuentemente para aplicar una función a subconjuntos de un vector. Normalmente, al trabajar con bases de datos, se cuenta con variables de distinta naturaleza, algunas pueden ser numéricas, otras categóricas, la idea de tapply()
es obtener resúmenes de un vector pero siendo agrupado en relación a otros vectores (variables).
En esta ocasión utilizaremos e nuevo la base de datos de starwars vista en el post sobre el paquete inspectdf
.
Si quisiéramos saber la altura promedio de los personajes, basta con ejecutar el siguiente comando.
mean(starwars$height, na.rm = TRUE)
## [1] 174.358
Sin embargo, es más valioso obtener la altura promedio de acuerdo con otra variable de interés que nos permita hacer alguna comparación, como por ejemplo el género. Para esto podemos utilizar la función tapply()
.
tapply(X=starwars$height, #Variable de interés
INDEX=starwars$gender, #Variable de agrupamiento
FUN=mean) #Función a aplicar
## feminine masculine
## NA NA
Los NA que aparecen se deben a que existen valores faltantes dentro de la base de datos, por lo cual la función mean()
no calcula correctamente el promedio a menos que se realice una imputación de estos valores faltantes o bien se indique que la función mean()
debe omitir los valores faltantes usando el argumento na.rm=TRUE
. En la mayoría de las funciones de la familia apply
, los argumentos que pertenecen a al función que se está aplicando (en este caso mean()
) deben ir después del argumento FUN
.
tapply(X=starwars$height, #Variable de interés
INDEX=starwars$gender, #Variable de agrupamiento
FUN=mean, #Función a aplicar
na.rm=TRUE) #Se omiten los NA
## feminine masculine
## 164.6875 176.5161
La función tapply()
no está limitada a una única variable de agrupamiento. El mismo concepto de “dimensiones” que aplicamos en la función apply()
puede ser aplicado a tapply()
, pero en esta ocasión las variables de agrupamiento deben especificarse dentro de una lista. A modo de ejemplo, supongamos que nos interesa saber la altura promedio según el género y el color de ojos.
tapply(X=starwars$height,
INDEX=list(starwars$eye_color, starwars$gender),
FUN=mean,
na.rm=TRUE)
## feminine masculine
## black 195.5 182.0000
## blue 167.0 189.7500
## blue-gray NA 182.0000
## brown 160.0 167.3846
## dark NA NaN
## gold NA 191.0000
## green, yellow NA 216.0000
## hazel 178.0 170.0000
## orange NA 180.5000
## pink NA 180.0000
## red NA 154.8000
## red, blue 96.0 NA
## unknown NA 136.0000
## white NA NA
## yellow 168.0 178.8000
Si se desea pueden agregarse más variables de agrupamiento, pero todas deben ser dentro de la lista. Por ejemplo, podría ser de interés agrupar también por el color de piel de los personajes, aunque en este caso el resultado mostraría muchos valores faltantes pues no todas las combinaciones existen. Esto es una demostración de que cada vez que se agrupen variables, estos agrupamientos deben tener sentido, pues de lo contrario solo se añadiría ruido al análisis.
tapply(X=starwars$height,
INDEX=list(starwars$eye_color, starwars$gender, starwars$skin_color),
FUN=mean,
na.rm=TRUE)
## , , blue
##
## feminine masculine
## black NA NA
## blue NA 196
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel 178 NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , blue, grey
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 115.5
##
## , , brown
##
## feminine masculine
## black NA NA
## blue NA 234.0
## blue-gray NA NA
## brown NA 129.5
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 198.0
##
## , , brown mottle
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 180
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , brown, white
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA 216
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , dark
##
## feminine masculine
## black NA NA
## blue 184 NA
## blue-gray NA NA
## brown NA 183.3333
## dark NA NaN
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , fair
##
## feminine masculine
## black NA NA
## blue 158.5 180.8571
## blue-gray NA 182.0000
## brown 163.0 185.3333
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA 170.0000
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , fair, green, yellow
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow 168 NA
##
## , , gold
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 167
##
## , , green
##
## feminine masculine
## black NA 184.5
## blue NA NA
## blue-gray NA NA
## brown NA 66.0
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 206.0
## pink NA NA
## red NA 190.0
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 183.0
##
## , , green-tan, brown
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 175
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , green, grey
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA 193
## white NA NA
## yellow NA NA
##
## , , grey
##
## feminine masculine
## black 213 198.3333
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA 191.0000
## green, yellow NA NA
## hazel NA NA
## orange NA 224.0000
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , grey, blue
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA 79
## white NA NA
## yellow NA NA
##
## , , grey, green, yellow
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 163
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , grey, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 112
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , light
##
## feminine masculine
## black NA NA
## blue 165.00 176.5
## blue-gray NA NA
## brown 159.25 185.5
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NaN NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , metal
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 200
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , mottled green
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 191
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , none
##
## feminine masculine
## black NA NaN
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , orange
##
## feminine masculine
## black NA 188
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 196
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , pale
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA 188
## pink NA 180
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 184
##
## , , red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 175
##
## , , red, blue, white
##
## feminine masculine
## black 178 NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , silver, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue 96 NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , tan
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA 187
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , unknown
##
## feminine masculine
## black NA NA
## blue NA 228
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , white
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA 233
##
## , , white, blue
##
## feminine masculine
## black NA 122
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 96
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , white, red
##
## feminine masculine
## black NA NA
## blue NA NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA 97
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA
##
## , , yellow
##
## feminine masculine
## black NA NA
## blue 168 NA
## blue-gray NA NA
## brown NA NA
## dark NA NA
## gold NA NA
## green, yellow NA NA
## hazel NA NA
## orange NA NA
## pink NA NA
## red NA NA
## red, blue NA NA
## unknown NA NA
## white NA NA
## yellow NA NA