Agregación secuencial con una sola llamada a pivot_wider
Considere el dataframe:
df <- data.frame(x = c(1,2,1,1), y = c(“a”, “a”, “b”, “a”))
Al aplicar el siguiente código
library(tidyverse)
df %>%
pivot_wider(names_from = y, values_from = y, values_fn = length, names_prefix = "tot_", values_fill = 0) %>%
mutate(per_a = 100*tot_a / rowSums(select(.,starts_with("tot_")))) %>%
mutate(per_b = 100*tot_b / rowSums(select(.,starts_with("tot_"))))
se obtiene el resultado
1 1 2 1 66.7 33.3
2 2 1 0 100 0
Mi pregunta es: ¿Es posible obtener el mismo resultado utilizando una única llamada a pivot_wider, es decir, sin ninguna mutate?
davy.ai
Sí, es posible obtener el mismo resultado utilizando una sola llamada de
pivot_wider
:Este código crea un formato ancho del dataframe
df
con los conteos de cada valor dey
. El argumentovalues_fn
se establece enlist(length)
para contar el número de apariciones de cada valor dey
. El argumentovalues_fill
también se establece enlist(length = 0)
para rellenar los valores faltantes con ceros.Luego, se utiliza la función
mutate
con la funciónacross
para calcular el porcentaje de cada valor dey
(a
yb
) con respecto al conteo total de cada fila (que se obtiene sumando todas las columnas que comienzan con"tot_"
). El argumento.names
se utiliza para crear nombres de columna con el prefijo"per_"
y los nombres de columna originales de las columnastot_
.