Агрегирование процента для одного столбца по категориям в другом столбце в R

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

Ссылка на статью, содержащую образцы данных

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

Пожалуйста, редактировать ваш вопрос, чтобы включить ожидаемый результат для ваших образцов данных.

Maurits Evers 02.05.2018 00:34

Привет. Я добавил пример результата к вопросу. Заранее спасибо.

Joke O. 02.05.2018 00:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

используя базу 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

Решение 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

Создано 01.05.2018 пользователем пакет REPEX (v0.2.0).

Другие вопросы по теме