Calcular el porcentaje por grupo con múltiples columnas en R
Tengo varios data frames con datos mensuales, me gustaría encontrar la distribución porcentual para cada producto y para cada mes. Tengo un problema con varias columnas con meses. Actualmente, solo puedo obtener un porcentaje por grupo para un mes.
data <- data.frame(group = rep(LETTERS[1:3], each = 4),
Product = letters[1:4],
January = sample(1:100,12),
February = sample(1:100,12))
data_new1 <- transform(data,
perc = ave(January,
group,
FUN = prop.table))
data_new1$perc<-round(data_new1$perc, 2)
> data_new1
group Product January February perc
1 A a 12 16 0.05
2 A b 73 75 0.32
3 A c 78 11 0.34
4 A d 65 35 0.29
5 B a 86 63 0.36
6 B b 33 71 0.14
7 B c 92 49 0.38
8 B d 30 60 0.12
9 C a 91 59 0.37
10 C b 31 45 0.12
11 C c 99 7 0.40
12 C d 28 50 0.11
davy.ai
Para obtener la distribución porcentual para cada producto y cada mes, puedes usar la función
melt
del paquetereshape2
para convertir el marco de datos en formato ancho a formato largo. Esto creará una nueva columna para los valores de los meses. Luego, puedes usar la funciónddply
del paqueteplyr
para agrupar los datos por producto y mes, y calcular la distribución porcentual usando las funcionesprop.table
ysum
. Finalmente, puedes usar la funcióndcast
del paquetereshape2
para convertir el marco de datos en formato largo nuevamente a formato ancho con los valores de distribución porcentual para cada producto y cada mes.Aquí tienes un ejemplo de código:
“`{r}
library(reshape2)
library(plyr)
Convertir el marco de datos en formato ancho a formato largo
data_long <- melt(data, id.vars = c(“group”, “Product”),
variable.name = “Month”, value.name = “Value”)
Agrupar los datos por producto y mes para calcular la distribución porcentual
data_perc <- ddply(data_long, .(Product, Month),
summarize, perc = sum(Value)/sum(data_long$Value))
Convertir el marco de datos en formato largo a formato ancho con los valores de distribución porcentual para cada producto y cada mes
data_wide <- dcast(data_perc, Product ~ Month, value.var = “perc”)
Redondear los valores de distribución porcentual a 2 decimales
data_wide[, -1] <- round(data_wide[, -1], 2)
Imprimir el resultado del marco de datos en formato ancho
data_wide
Product Febrero Enero
1 a 0.38 0.30
2 b 0.14 0.26
3 c 0.33 0.36
4 d 0.15 0.08
“`