es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la distribución porcentual para cada producto y cada mes, puedes usar la función melt del paquete reshape2 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ón ddply del paquete plyr para agrupar los datos por producto y mes, y calcular la distribución porcentual usando las funciones prop.table y sum. Finalmente, puedes usar la función dcast del paquete reshape2 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


    Esto te dará un nuevo marco de datos `data_wide` con los valores de distribución porcentual para cada producto y cada mes. El marco de datos resultante se verá así:

    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
    “`

Comments are closed.