2017-11-27 1 views
1

SO에 관한 비슷한 질문을 한 후, like here 나는 마침내 내가 원하는 결과물을 얻었지만 거기에 갈 수있는 더 좋은 방법이 있는지 궁금해 할 수 없습니다. 또한 파이프 연산자를 사용하여 관리자 및 제목 조합 반복을 제거하는 마지막 단계를 연결하는 방법이 있는지 궁금합니다.dplyr을 사용하여 하위 그룹별로 백분율을 요약하는 더 나은 방법은 무엇입니까?

재현 예 : 생각과 도움에 미리

library(dplyr) 

# Sample data frame 
employee = LETTERS[1:18] 
manager = c(rep("Tom", 3), rep("Sue", 4), rep("Mike", 4), rep("Jack", 7)) 
title = c(rep("Entry", 2), rep("Mid", 3), rep("Junior", 7), rep("Senior", 6)) 

mydata <- data.frame(employee, manager, title) 

# Code gives me output I want, but wondering if there is a better way 
org2 <- mydata %>% 
    group_by(manager, title) %>% 
    mutate(title_count = n()) %>% # Total number of people with given title by manager 
    ungroup() %>% 
    group_by(manager) %>%   # Total number of people in manager's group 
    mutate(mgr_total = n()) %>% 
    group_by(title, add = TRUE) %>% 
    mutate(title_pctg = round(title_count/mgr_total*100, 1)) %>% # Percent of people with given title by manager 
    select(-employee) 

# Remove duplicates of manager and title to summarize data wanted 
org2 <- org2[!duplicated(org2[2:4]), ] 

arrange(org2, manager, title) 

# A tibble: 7 x 5 
# Groups: manager, title [7] 
# manager title title_count mgr_total title_pctg 
# <fctr> <fctr>  <int>  <int>  <dbl> 
#1 Jack Junior   1   7  14.3 
#2 Jack Senior   6   7  85.7 
#3 Mike Junior   4   4  100.0 
#4  Sue Junior   2   4  50.0 
#5  Sue Mid   2   4  50.0 
#6  Tom Entry   2   3  66.7 
#7  Tom Mid   1   3  33.3 

감사합니다.

답변

2

group_by (즉, 그룹을 manager으로 그룹화 한 다음 다른 방법 대신 manger + title)으로 전환하면 다음과 같이 단순화 할 수 있습니다.

mydata %>% 
    group_by(manager) %>% 
    mutate(mgr_count = n()) %>% 
    group_by(title, mgr_count, add=TRUE) %>% 
    summarise(
     title_count = n(), 
     title_pctg = round(title_count/first(mgr_count) * 100, 1) 
    ) 

# A tibble: 7 x 5 
# Groups: manager, title [?] 
# manager title mgr_count title_count title_pctg 
# <fctr> <fctr>  <int>  <int>  <dbl> 
#1 Jack Junior   7   1  14.3 
#2 Jack Senior   7   6  85.7 
#3 Mike Junior   4   4  100.0 
#4  Sue Junior   4   2  50.0 
#5  Sue Mid   4   2  50.0 
#6  Tom Entry   3   2  66.7 
#7  Tom Mid   3   1  33.3 
+1

우수. 나는 "처음"이라는 기능과 그것이 얼마나 편리한 지 잘 모르고있었습니다. – DaveM

관련 문제