R'deki belirli kategori için diğer sütunlara göre sütunları yüzde olarak hesaplama

0

Soru

Ben R ile yeni başlayanım ve görevle ilgili yardıma ihtiyacım var. Dput ile kukla veri kümesinin çıktısı (gerçek küme gerçekten büyük):

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

Yapılması gerekenler: Her markanın payını yüzde olarak gösterecek bir sütun eklenmelidir. İlk önce yaptığım şey bu şekilde yeni bir "DEĞER" sütunu oluşturmak:

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

Şimdi sütun payı şu şekilde oluşturulmalıdır: belirli bir kategorideki belirli bir markanın değerlerinin toplamı (sütun DEĞERİNDEN), tüm kategorinin değerlerinin toplamına bölünür. Örneğin," ROTHMANS " CIG kategorisindedir, bunun için değerlerin toplamı 319.92'dir, tüm CIG kategorisinin toplamı 2285,56'dır, dolayısıyla PAY=%14'tür. Ve her durumda hesaplanmalıdır. Dplyr kütüphanesinin uygun olabileceğini düşünüyorum, ancak bir çözüm bulamıyorum.

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

En iyi cevabı

1

İlk olabilir sum bu BRAND değer verin ve her biri için oranı alın 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

Yeni bir sütunun iyi hesaplandığı görülüyor, ancak diğer sütunlar (KOD, TUTAR, FİYAT) neden kayboldu? Aslında onlar da son sette olmalı. @ RonakShah
Bambeil

Elbette ekleyebilirsiniz %>% left_join(df, by = c("CATEGORY", "BRAND")) onları geri almak için ama orijinalinden beri bunu not et df her marka için yinelenen satırlar var, nihai çıktı da buna sahip olacaktı.
Ronak Shah
1

A data.table çözüm olabilir:

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

düzenlemek

Orijinal değerleri korumak için bu olabilir:

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

Yeni bir sütunun iyi hesaplandığı görülüyor, ancak diğer sütunlar (KOD, TUTAR, FİYAT) neden kayboldu? Aslında onlar da son sette olmalı. @s__
Bambeil

Çünkü kod gruplandırılıyor ve özetleniyor. Bu bilgileri almak için orijinal df'ye katılabilirsiniz, ancak SHARE ve VALUE sonuç (hesaplanan VALUE).
s__

@ Bambeil açıklamalar için düzenlemeye bakın.
s__
1

Kullanabiliriz 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

Diğer dillerde

Bu sayfa diğer dillerde

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