Суммарный процент для одного столбца по категориям в другом столбце в R - PullRequest
0 голосов
/ 02 мая 2018

Я знаю, что это просто, но у меня проблемы с этим. Я взял этот пример данных из:

Ссылка на статью с примерами данных

companiesData <- data.frame(fy = c(2010,2011,2012,2010,2011,2012,2010,2011,2012),
                            company = c("Apple","Apple","Apple","Google","Google","Google",
                                        "Microsoft","Microsoft","Microsoft"),
                            revenue = c(65225,108249,156508,29321,37905,50175,
                                        62484,69943,73723), 
                            profit = c(14013,25922,41733,8505,9737,10737,
                                       18760,23150,16978))

Как бы я нашел процентную прибыль для каждой компании за каждый год? Примером может быть добавление всей прибыли для Apple, а затем процент этой суммы для каждой строки яблока, в зависимости от ситуации Конечные результаты должны представлять собой таблицу со всеми столбцами, но только агрегированные по компаниям с использованием процентной прибыли. Годы остаются прежними. Ответ будет 17,16% для первого ряда Apple и рассчитывается по:

(14013/81668)*100

Где 81668 - это общее значение для яблока, а 17,16% - это процентная прибыль для первого ряда Apple, которая приходится на 2010 год. Я не хочу, чтобы это делалось как временной ряд, поскольку переменная не обязательно должна быть временем. Это может быть местоположение.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

dplyr решение: сгруппируйте по компаниям, сложите всю прибыль этой компании, а затем создайте новую переменную доли прибыли каждого года в общей прибыли.

library(dplyr)

# delete reading in data from OP

companiesData %>%
    group_by(company) %>%
    mutate(total_profit = sum(profit)) %>%
    mutate(share_this_yr = profit / total_profit)
#> # A tibble: 9 x 6
#> # Groups:   company [3]
#>      fy company   revenue profit total_profit share_this_yr
#>   <dbl> <fct>       <dbl>  <dbl>        <dbl>         <dbl>
#> 1  2010 Apple       65225  14013        81668         0.172
#> 2  2011 Apple      108249  25922        81668         0.317
#> 3  2012 Apple      156508  41733        81668         0.511
#> 4  2010 Google      29321   8505        28979         0.293
#> 5  2011 Google      37905   9737        28979         0.336
#> 6  2012 Google      50175  10737        28979         0.371
#> 7  2010 Microsoft   62484  18760        58888         0.319
#> 8  2011 Microsoft   69943  23150        58888         0.393
#> 9  2012 Microsoft   73723  16978        58888         0.288

Создано в 2018-05-01 пакетом Представ (v0.2.0).

0 голосов
/ 02 мая 2018

с использованием базы r:

fun=function(x)paste0(round(x/sum(x)*100,2),"%")
transform(companiesData,prec=ave(profit,company,FUN=fun))
    fy   company revenue profit   prec
1 2010     Apple   65225  14013 17.16%
2 2011     Apple  108249  25922 31.74%
3 2012     Apple  156508  41733  51.1%
4 2010    Google   29321   8505 29.35%
5 2011    Google   37905   9737  33.6%
6 2012    Google   50175  10737 37.05%
7 2010 Microsoft   62484  18760 31.86%
8 2011 Microsoft   69943  23150 39.31%
9 2012 Microsoft   73723  16978 28.83%


library(data.table)
setDT(companiesData)[,prec:=profit/sum(profit)*100,by=company][]
     fy   company revenue profit     prec
1: 2010     Apple   65225  14013 17.15850
2: 2011     Apple  108249  25922 31.74071
3: 2012     Apple  156508  41733 51.10080
4: 2010    Google   29321   8505 29.34884
5: 2011    Google   37905   9737 33.60019
6: 2012    Google   50175  10737 37.05097
7: 2010 Microsoft   62484  18760 31.85708
8: 2011 Microsoft   69943  23150 39.31191
9: 2012 Microsoft   73723  16978 28.83100
...