假设一家公司有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值。
例如,对于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。因此,最后的输出应该如下所示:
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))除了这个问题,你能给我任何关于这个问题的反馈(特别是我的代码)或者任何提高数据操作技巧的建议吗?(你可以从我的个人资料中看到,我问了很多这样的问题,但我还是不能自己解决)
发布于 2019-02-27 20:09:57
添加关于您所做的事情的更多细节和@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生成一个唯一的值,但是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)是根据group_by为每个Boss值计算的。一次,对于每一行,您都有一个项目权重(这取决于老板),您可以使用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))发布于 2019-02-27 19:21:47
我们可以得到sum的`n_Projects和性能的乘积,除以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.649https://stackoverflow.com/questions/54912864
复制相似问题