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 de que solo 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 sugerencias. 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; solo 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.