Calcular porcentajes por grupos con dplyr

A la hora de sumarizar datos con dplyr podemos calcular porcentajes dentro de grupos o subgrupos con transmute. La sintaxis es sencilla pero tiene la peculiaridad que sólo obtendremos como salida lo que indiquemos en transmute. Mejor lo entendéis en un ejemplo:

Conjunto de datos aleatorio de ejemplo:

library(dplyr)
observaciones = 100
grupo_1 = rpois(observaciones, 0.5)
grupo_2 = rpois(observaciones, 1)

df = cbind.data.frame(grupo_1, grupo_2) %>% mutate(id_cliente=n()) 

Sumarizamos por grupos:

df %>% group_by(grupo_1, grupo_2) %>% summarise(clientes = n()) 

Contamos clientes y calculamos el porcentaje sobre el total:

df %>% group_by(grupo_1, grupo_2) %>% 
  summarise(clientes = n(),
            pct_total = n()/nrow(df)) 

Suelo usar nrow se aceptan sugencias. Calculamos el porcentaje para el subgrupo del grupo_1, primer ejemplo de uso de transmute:

df %>% group_by(grupo_1, grupo_2) %>% 
  summarise(clientes = n()) %>% 
  transmute(grupo_2, pct_grupo = clientes/sum(clientes))

Vemos que clientes ha desaparecido, sólo obtenemos grupo_1, grupo_2 y pct_grupo. Si queremos el porcentaje sobre el total:

df %>% group_by(grupo_1, grupo_2) %>% 
  summarise(clientes = n()) %>% 
  transmute(grupo_2, pct_grupo = clientes/sum(clientes),
            pct_total = clientes/nrow(df)) 

Aquí lo tengo todo recogido, para cuando no lo recuerde. Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *