tapply en R

Aprende todo sobre la función tapply

¿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