让我们假设一家公司有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
除此问题外,您能否给我有关此问题的任何反馈(特别是我的代码),或提供任何建议以提高数据处理技能? (您可以在个人资料中看到我提出了很多类似的问题,但仍然无法自行解决)
答案 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))