tapply en R
¿Qué significa tapply
en R? tapply
es una función de R que permite crear resúmenes estadísticos por grupos en base a los niveles de uno o varios factores. En este tutorial aprenderás a usar la función tapply
en R en varios escenarios con ejemplos.
La función tapply en R
La función tapply
es muy similar a la función apply
. En el siguiente bloque de código mostramos la sintaxis de la función y la descripción simplificada de cada argumento.
tapply(X, # Objeto divisible (matriz, data frame, ...)
INDEX, # Lista(s) de factores de la misma longitud que X
FUN, # Función que se aplicará a los factores (o NULL)
..., # Argumentos adicionales para pasar a FUN
default = NA, # Si simplify = TRUE, es el valor de inicialización del array
simplify = TRUE) # Si FALSE devuelve una lista
Ten en cuenta que los tres primeros argumentos son los más habituales y que es común no especificar el nombre de los argumentos en las funciones de la familia apply debido a su simple sintaxis.
¿Cómo usar la función tapply en R?
La función tapply
es muy fácil de usar en R. Primero, considera el siguiente conjunto de datos de ejemplo, que representa el precio de algunos objetos, su tipo y la tienda donde se vendió.
set.seed(2)
data_set <- data.frame(precio = round(rnorm(25, sd = 10, mean = 30)),
tipo = sample(1:4, size = 25, replace = TRUE),
tienda = sample(paste("Tienda", 1:4),
size = 25, replace = TRUE))
head(data_set)
precio tipo tienda
21 2 Tienda 2
32 3 Tienda 3
46 4 Tienda 4
19 3 Tienda 4
29 1 Tienda 4
31 3 Tienda 4
Segundo, almacena los valores como variables y convierte la columna tipo
a factor, para que los nombres de los niveles se muestren en la salida de la función cuando se ejecute.
precio <- data_set$precio
tienda<- data_set$tienda
tipo <- factor(data_set$tipo,
labels = c("juguetes", "comida", "electrónica", "bebidas"))
Por último, puedes usar la función tapply
para calcular la media por tipo de objeto de las tiendas de la siguiente manera:
# Precio medio por tipo de producto
precios_medios <- tapply(precio, tipo, mean)
precios_medios
juguetes comida electrónica bebidas
39.50000 30.33333 32.20000 29.33333
Nótese que los argumentos de la función tapply
deben tener la misma longitud. Puedes verificarlo con la función length
. También debe tenerse en cuenta que la salida predeterminada es de clase “array”.
class(precios_medios) # "array"
Por lo tanto, si es necesario, puedes acceder a cada elemento de la salida especificando el índice deseado entre corchetes.
precios_medios[2] # 30.33333
Sin embargo, la clase de salida puede ser de clase list
(una lista) si estableces el argumento simplify
como FALSE
.
# Precio medio por tipo de producto
lista_precios_medios <- tapply(precio, tipo, mean, simplify = FALSE)
lista_precios_medios
$juguetes
[1] 39.5
$comida
[1] 30.33333
$electrónica
[1] 32.2
$bebidas
[1] 29.33333
En este caso, puedes acceder a los elementos de salida con el signo $
y el nombre del elemento.
lista_precios_medios$juguetes # 39.5
Argumentos adicionales: Ignorar valores NA
Supón que tienes un data frame que contiene algunos valores NA
en sus columnas.
# Añadiendo valores NA al conjunto de datos
data_set[1, 1] <- NA
data_set[2, 3] <- NA
# Precio medio por tienda
tapply(data_set$precio, data_set$tienda, mean)
Tienda 1 Tienda 2 Tienda 3 Tienda 4
32.00000 NA 39.25000 33.14286
Dentro de la función tapply
puedes especificar argumentos adicionales de la función que estás aplicando después del argumento FUN
. En este caso, la función mean
permite especificar el argumento na.rm
para eliminar los valores NA
(por defecto este argumento es FALSE
).
tapply(data_set$precio, data_set$tienda, mean, na.rm = TRUE)
Tienda 1 Tienda 2 Tienda 3 Tienda 4
32.00000 33.50000 39.25000 33.14286
Lo anterior es equivalente a lo siguiente:
f <- function(x) mean(x, na.rm = TRUE)
tapply(data_set$precio, data_set$tienda, f)
Tapply en R con múltiples factores
Puedes aplicar la función tapply
a varias columnas (o variables de tipo factor) pasándolas a través de una lista. En este ejemplo, vamos a aplicar la función tapply
a los factores tipo
y tienda
para calcular el precio medio de los objetos por tipo y tienda.
# Precio medio por tipo de producto y tienda
tapply(precio, list(tipo, tienda), mean)
Tienda 1 Tienda 2 Tienda 3 Tienda 4
juguetes 46 31.00000 49 36.66667
comida 26 30.33333 39 NA
electrónica 50 29.00000 32 25.00000
bebidas 22 40.00000 20 36.00000
Observa que no se vendió comida en la Tienda 4, por lo que se devuelve un NA
. Para sobrescribir este comportamiento, puedes asignar en el argumento default
un valor para que aparezca en lugar de un NA
. En este ejemplo, decidimos establecerlo en 0.
# Precio medio por tipo de producto y tienda, cambiando el argumento 'default'
tapply(precio, list(tipo, tienda), mean, default = 0)
Tienda 1 Tienda 2 Tienda 3 Tienda 4
juguetes 46 31.00000 49 36.66667
comida 26 30.33333 39 0.00000
electrónica 50 29.00000 32 25.00000
bebidas 22 40.00000 20 36.00000