group_by () суммировать () и весовые проценты - R - PullRequest
0 голосов
/ 27 февраля 2019

Предположим, что в компании есть 3 босса и 20 сотрудников, где каждый Employee сделал n_Projects с общим Performance в процентах:

> df <- data.frame(Boss = sample(1:3, 20, replace=TRUE),
                  Employee = sample(1:20,20),
                  n_Projects = sample(50:100, 20, replace=TRUE),
                  Performance = round(sample(1:100,20,replace=TRUE)/100,2),
                  stringsAsFactors = FALSE)

> df
   Boss Employee n_Projects Performance
1     3        8         79        0.57
2     1        3         59        0.18
3     1       11         76        0.43
4     2        5         85        0.12
5     2        2         75        0.10
6     2        9         66        0.60
7     2       19         85        0.36
8     1       20         79        0.65
9     2       17         79        0.90
10    3       14         77        0.41
11    1        1         78        0.97
12    1        7         72        0.52
13    2        6         62        0.69
14    2       10         53        0.97
15    3       16         91        0.94
16    3        4         98        0.63
17    1       18         63        0.95
18    2       15         90        0.33
19    1       12         80        0.48
20    1       13         97        0.07

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

Например, для босса 1 мы имеемвсего 604 n_Projects, где проект 1 имеет весовой коэффициент производительности 0,13 (78/604 * 0,97 = 0,13), проект 3 - весовой коэффициент производительности 0,1 (59/604 * 0,18 = 0,02) и т. д.Сумма этих весов производительности - это производительность босса, для босса 1 - 0,52.Итак, окончательный результат должен быть таким:

 Boss  total_Projects Performance
    1             604        0.52
    2             340        0.18  #the values for boss 2 are invented
    3             230        0.43  #the values for boss 3 are invented

Однако я все еще борюсь с этим:

df %>%
  group_by(Boss) %>%
  summarise(total_Projects = sum(n_Projects),
            Weight_Project = n_Projects/sum(total_Projects))

В дополнение к этой проблеме, можете ли вы дать мне какой-либо отзывоб этой проблеме (мой код, в частности) или какие-либо рекомендации по улучшению навыков манипулирования данными?(вы можете видеть в моем профиле, что я задавал много подобных вопросов, но все же я не могу решить их самостоятельно)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Добавление некоторых подробностей о том, что вы сделали, и ответа @ akrun:

Вы должны получить следующее сообщение об ошибке:

df %>%
  group_by(Boss) %>%
  summarise(total_Projects = sum(n_Projects),
            Weight_Project = n_Projects/sum(total_Projects))

## Error in summarise_impl(.data, dots) : 
##  Column `Weight_Project` must be length 1 (a summary value), not 7

Это говорит о том, что исчисление, которое вы сделали для Weight_Project не дает уникального значения для каждого Boss, но 7. summarise позволяет суммировать нескольких значений в одно (с помощью сумм и т. Д.).Здесь вы просто делите каждое значение n_Projects на sum(total_Projects), но не суммируете его в одно значение.

Если предположить, что сначала вы рассчитывали вес для каждого исполнения, а затемКомбинируя его с меткой производительности для получения средневзвешенной производительности, вы можете выполнить два шага:

df %>% 
  group_by(Boss) %>% 
  mutate(Weight_Performance = n_Projects / sum(n_Projects)) %>% 
  summarise(weighted_mean_performance = sum(Weight_Performance * Performance))

Оператор mutate сохраняет количество общих строк в df, но sum(n_Projects) - эторассчитывается для каждого значения Boss благодаря group_by.После того, как для каждой строки у вас есть вес проекта (который зависит от начальника), вы можете вычислить средневзвешенное значение - , которое, таким образом, является средним значением - с summarise.

Более компактный способ отображения весового исчисления:

df %>% 
  group_by(Boss) %>% 
  summarise(weighted_mean_performance = sum((n_Projects / sum(n_Projects)) * Performance))

# Reordering to minimise parenthesis, which is @akrun's answer
df %>% 
  group_by(Boss) %>% 
  summarise(weighted_mean_performance = sum(n_Projects * Performance) / sum(n_Projects))
0 голосов
/ 27 февраля 2019

Мы можем получить sum продукта n_Projects и Performance и разделить на total_projects

library(dplyr)
df %>% 
    group_by(Boss) %>% 
    summarise(total_projects = sum(n_Projects), 
              Weight_Project = sum(n_Projects * Performance)/total_projects)
    # or
    # Weight_Project = n_Projects %*% Performance/total_projects)
# A tibble: 3 x 3
#   Boss total_projects Weight_Project
#  <int>          <int>          <dbl>
#1     1            604          0.518
#2     2            595          0.475
#3     3            345          0.649
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...