group_by()summarise()和权重百分比-R

时间:2019-02-27 19:13:25

标签: r dplyr aggregate data-manipulation

让我们假设一家公司有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

CEO要求我计算每个老板的工作质量。但是,他要求进行特定的计算:每个Performance值的权重必须等于该老板的n_Project总值中的n_Project值。

例如,对于老板1,我们总共有604 n_Projects,其中项目1的绩效权重为0,13 (78/604 * 0,97 = 0,13),项目3的绩效权重为{{1 }}(0,1),依此类推。这些性能权重的总和为Boss性能,对于Boss 1为59/604 * 0,18 = 0,02。因此,最终输出应如下所示:

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

除此问题外,您能否给我有关此问题的任何反馈(特别是我的代码),或提供任何建议以提高数据处理技能? (您可以在个人资料中看到我提出了很多类似的问题,但仍然无法自行解决)

2 个答案:

答案 0 :(得分:4)

我们可以得到“ n_Projects”和“ Performance”乘积的sum,然后除以“ 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

答案 1 :(得分:2)

添加有关您的操作和@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计算加权平均值-这是一个平均值,因此是一个汇总值。 / p>

更紧凑的方式仍然可以显示加权演算:

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