簡體   English   中英

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

[英]group_by() summarise() and weights percentages - R

假設一家公司有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,159/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))

除此問題外,您能否給我有關此問題的任何反饋(特別是我的代碼),或提供任何建議以提高數據處理技能? (您可以在個人資料中看到我提出了很多類似的問題,但仍然無法自行解決)

我們可以得到的sum ‘由和鴻溝‘total_projects’`n_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

添加有關您的操作和@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的每個值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的總行數,但是感謝group_by為每個Boss值計算sum(n_Projects) 有一次,對於每一行,你有一個項目的重量(取決於老板),就可以計算出加權平均- 這是一個平均值因此匯總值 -與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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM