El cálculo de columnas en base a porcentaje en otras columnas para categoría en particular, en R

0

Pregunta

Soy un principiante con R y necesita ayuda con la tarea. La salida de dummy conjunto de datos con dput (real, el conjunto es muy grande):

structure(list(CODE = c(453, 463, 476, 
798, 885, 582, 626, 663, 457, 408
), CATEGORY = c("CIG", "BET", "CIG", "CIG", "ARI", "CRR", "ARI", "CIG", 
"CIG", "BET"), AMOUNT = c(22, 5, 6, 52, 16, 11, 6, 70, 208, 5), 
    PRICE = c(5.56, 8.29, 3.89, 3.8, 4.05, 3.99, 3.55, 7.69, 6.75, 
    5.2), BRAND = c("ROTHMANS", "ALLINO", "MARLBORO", "ROTHMANS", "AURIELO", 
    "SOLINOS", "CHLEBLO", "MARLBORO", "LD", "SOLINOS"
    )), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

Qué debe hacer: una columna, la cual muestra la participación de cada MARCA en por ciento debe ser añadido. Primero lo que he hecho es crear una nueva columna "VALOR" de esta manera:

df$VALUE <- with(df, AMOUNT*PRICE)

Ahora la columna de COMPARTIR debe ser creado de tal manera: la suma de los valores (de la columna) el VALOR de una marca en particular en una categoría en particular, dividido por la suma de los valores de toda la categoría. Por ejemplo, "ROTHMANS" está en la categoría CIG, la suma de los valores de es 319.92, la suma de la totalidad de la CIG categoría es 2285,56, por lo que, el RECURSO=14%. Y debe ser calculado en cada caso. Creo que dplyr de la biblioteca puede ser adecuado, pero no puede encontrar una solución.

calculated-columns dataframe dplyr r
2021-10-27 13:19:23
3

Mejor respuesta

1

Primero sum el BRAND valor y obtener la proporción para cada uno de los CATEGORY.

library(dplyr)

df %>%
  group_by(CATEGORY, BRAND) %>%
  summarise(VALUE = sum(VALUE)) %>%
  mutate(SHARE = prop.table(VALUE) * 100) %>%
  ungroup

#  CATEGORY BRAND     VALUE SHARE
#  <chr>    <chr>     <dbl> <dbl>
#1 ARI      AURIELO    64.8  75.3
#2 ARI      CHLEBLO    21.3  24.7
#3 BET      ALLINO     41.4  61.5
#4 BET      SOLINOS    26    38.5
#5 CIG      LD       1404    61.4
#6 CIG      MARLBORO  562.   24.6
#7 CIG      ROTHMANS  320.   14.0
#8 CRR      SOLINOS    43.9 100  
2021-10-27 13:24:05

Parece que una nueva columna se calcula bien, pero, ¿por qué otras columnas (CÓDIGO, CANTIDAD, PRECIO) desaparecen? En realidad, deberían estar en la final también. @RonakShah
Bambeil

Asegúrese de que usted puede agregar %>% left_join(df, by = c("CATEGORY", "BRAND")) para volver, pero tenga en cuenta que desde su original df ha filas duplicadas para cada marca el resultado final tendría demasiado.
Ronak Shah
1

Un data.table la solución podría ser:

library(data.table)

res <- setDT(df)[,'.'(VALUE = sum(VALUE)), by = list(CATEGORY,BRAND)
               ][,':='(SHARE = round(VALUE/sum(VALUE)*100,2)), by = list(CATEGORY)]

res
  CATEGORY    BRAND   VALUE  SHARE
1:      CIG ROTHMANS  319.92  14.00
2:      BET   ALLINO   41.45  61.45
3:      CIG MARLBORO  561.64  24.57
4:      ARI  AURIELO   64.80  75.26
5:      CRR  SOLINOS   43.89 100.00
6:      ARI  CHLEBLO   21.30  24.74
7:      CIG       LD 1404.00  61.43
8:      BET  SOLINOS   26.00  38.55

EDITAR

Para mantener los valores originales podría ser esta:

res <- setDT(df)[,'.'(VALUE = sum(VALUE)), by = list(CATEGORY,BRAND)
               ][,':='(SHARE = round(VALUE/sum(VALUE)*100,2)), by = list(CATEGORY)
               ][setDT(df), on = c('BRAND','CATEGORY')
               ][,-('i.VALUE')]
res

    CATEGORY    BRAND   VALUE  SHARE CODE AMOUNT PRICE
 1:      CIG ROTHMANS  319.92  14.00  453     22  5.56
 2:      BET   ALLINO   41.45  61.45  463      5  8.29
 3:      CIG MARLBORO  561.64  24.57  476      6  3.89
 4:      CIG ROTHMANS  319.92  14.00  798     52  3.80
 5:      ARI  AURIELO   64.80  75.26  885     16  4.05
 6:      CRR  SOLINOS   43.89 100.00  582     11  3.99
 7:      ARI  CHLEBLO   21.30  24.74  626      6  3.55
 8:      CIG MARLBORO  561.64  24.57  663     70  7.69
 9:      CIG       LD 1404.00  61.43  457    208  6.75
10:      BET  SOLINOS   26.00  38.55  408      5  5.20
2021-10-27 14:00:19

Parece que una nueva columna se calcula bien, pero, ¿por qué otras columnas (CÓDIGO, CANTIDAD, PRECIO) desaparecen? En realidad, deberían estar en la final también. @s__
Bambeil

Debido a que el código es agrupar y resumir. En caso de que usted puede unirse a la original df para obtener esas informaciones pero vas a engañar al SHARE y VALUE resultado (calculado VALUE).
s__

@Bambeil consulte edición de aclaraciones.
s__
1

Podemos utilizar base R

transform(aggregate(VALUE ~ CATEGORY + BRAND, df, sum), 
    SHARE = ave(VALUE, CATEGORY, FUN = proportions) * 100)
  CATEGORY    BRAND   VALUE     SHARE
1      BET   ALLINO   41.45  61.45293
2      ARI  AURIELO   64.80  75.26132
3      ARI  CHLEBLO   21.30  24.73868
4      CIG       LD 1404.00  61.42915
5      CIG MARLBORO  561.64  24.57341
6      CIG ROTHMANS  319.92  13.99744
7      BET  SOLINOS   26.00  38.54707
8      CRR  SOLINOS   43.89 100.00000
2021-10-27 13:37:37

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................