Le calcul des colonnes en%, sur la base d'autres colonnes pour une catégorie particulière dans la R

0

La question

Je suis un débutant avec R et ont besoin d'aide à la tâche. La sortie de mannequin dataset avec dput (réel jeu est vraiment très grand):

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"))

Ce qui devrait être fait: une colonne qui permettra de montrer la part de chaque MARQUE, en % doit être ajoutée. Tout d'abord ce que j'ai fait est de créer une nouvelle colonne "VALEUR" de cette façon:

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

Maintenant la colonne ACTION doit être créé dans une telle manière: somme des valeurs (à partir de la VALEUR de la colonne) d'une marque dans une catégorie donnée, divisée par la somme des valeurs de l'ensemble de la catégorie. Par exemple, "ROTHMANS" est dans la catégorie de la CIG, la somme des valeurs est 319.92, la somme pour l'ensemble de la CIG de la catégorie est 2285,56, donc, de la PART de=14%. Et il devrait être calculé dans chaque cas. Je pense que dplyr bibliothèque peut être adapté, mais ne peut pas trouver une solution.

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

La meilleure réponse

1

Vous pouvez d'abord sum l' BRAND valeur et obtenir de la part de chaque 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

Semble qu'une nouvelle colonne est calculé bien, mais pourquoi les autres colonnes (CODE, QUANTITÉ, PRIX) disparaissent? En fait, ils doivent être dans le final trop. @RonakShah
Bambeil

Bien sûr, vous pouvez ajouter %>% left_join(df, by = c("CATEGORY", "BRAND")) pour les récupérer, mais note que, depuis votre original df a deux lignes pour chaque marque, le résultat final aurait-il trop.
Ronak Shah
1

Un data.table la solution pourrait être:

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

MODIFIER

Pour conserver les valeurs d'origine pourrait être ceci:

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

Semble qu'une nouvelle colonne est calculé bien, mais pourquoi les autres colonnes (CODE, QUANTITÉ, PRIX) disparaissent? En fait, ils doivent être dans le final trop. @m__ _
Bambeil

Parce que le code est le regroupement et à la synthèse. Dans le cas où vous pouvez la joindre l'original de la df pour obtenir ces infos, mais vous aurez dupe le SHARE et VALUE résultat (calculé VALUE).
s__

@Bambeil voir modifier pour des précisions.
s__
1

Nous pouvons utiliser 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

Dans d'autres langues

Cette page est dans d'autres langues

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