首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >group_by()汇总()和权重百分比-R

group_by()汇总()和权重百分比-R
EN

Stack Overflow用户
提问于 2019-02-27 19:13:25
回答 2查看 1.5K关注 0票数 2

假设一家公司有3名老板和20名雇员,其中每个Employee完成n_Projects的总Performance百分比为:

代码语言:javascript
复制
> 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_Projectn_Project值。

例如,对于Boss 1,我们共有604 n_Projects,其中项目1的性能权重为0,13 (78/604 * 0,97 = 0,13),项目3的性能权重为0,1 (59/604 * 0,18 = 0,02),等等。这些性能权重之和为Boss性能,而Boss 1为0,52。因此,最后的输出应该如下所示:

代码语言:javascript
复制
 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

然而,我仍然在为这一点而挣扎:

代码语言:javascript
复制
df %>%
  group_by(Boss) %>%
  summarise(total_Projects = sum(n_Projects),
            Weight_Project = n_Projects/sum(total_Projects))

除了这个问题,你能给我任何关于这个问题的反馈(特别是我的代码)或者任何提高数据操作技巧的建议吗?(你可以从我的个人资料中看到,我问了很多这样的问题,但我还是不能自己解决)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-27 20:09:57

添加关于您所做的事情的更多细节和@akrun的回答:

您一定收到了以下错误消息:

代码语言:javascript
复制
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生成一个唯一的值,但是summarise会将几个值归纳为一个值(通过方法、和等)。在这里,您只需将n_Projects的每个值除以sum(total_Projects),但不能将其概括为一个值。

假设您的想法是首先计算每个性能的权重,然后将其与性能标记相结合以获得加权平均性能,则可以分两个步骤进行:

代码语言:javascript
复制
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)是根据group_by为每个Boss值计算的。一次,对于每一行,您都有一个项目权重(这取决于老板),您可以使用summarise计算加权平均值--这是一个平均值,因此是一个总结值。

一种更紧凑的方式,仍然允许出现加权演算,将是:

代码语言:javascript
复制
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))
票数 3
EN

Stack Overflow用户

发布于 2019-02-27 19:21:47

我们可以得到sum的`n_Projects和性能的乘积,除以total_projects。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54912864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档