2016-08-24 15 views
1

나는 직원에 의해 최고 3 요금을 파악하려고하지만 장소 열을 유지하려고합니다.Top 3 ID로 요금을

place<-c('Dest1', 'Dest2', 'Dest3', 'Dest4', 'Dest5', 'Dest6', 'Dest1', 'Dest2', 'Dest3', 'Dest4', 'Dest5', 'Dest6') 
rate <- c(0.5, 0.6, 0.7, 0.2, 0.5, 0.9, 0.8,0.9,0.2,0.5,0.3,0.7) 
employee <- c('A','A','A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B') 
employ.data <- data.frame(employee, rate, place) 

Dataframe는 다음과 같습니다 :

는이 모든 모습입니다

employee rate place 
1   A 0.5 Dest1 
2   A 0.6 Dest2 
3   A 0.7 Dest3 
4   A 0.2 Dest4 
5   A 0.5 Dest5 
6   A 0.9 Dest6 
7   B 0.8 Dest1 
8   B 0.9 Dest2 
9   B 0.2 Dest3 
10  B 0.5 Dest4 
11  B 0.3 Dest5 
12  B 0.7 Dest6 

가 어떻게 employee하여 상위 3 비율을 추출 할뿐만 아니라 place 열을 유지한다. 나는 을 dplyr에서 수행하는 방법을 알고 있지만 place 열은 제거 할 것입니다.

나는 같이하는 최종 결과를 원하는 :

employee rate place 
2   A 0.6 Dest2 
3   A 0.7 Dest3 
6   A 0.9 Dest6 
7   B 0.8 Dest1 
8   B 0.9 Dest2 
12  B 0.7 Dest6 

감사합니다!

+0

filter의 래퍼 인 top_n와 . 이미'group_by' 방법을 알고 있습니다. –

+0

죄송합니다. 나는 그것을 재개하고 해결책을 게시했다. 확인해주십시오. – akrun

답변

1

'직원'별로 그룹화 한 후 arrange의 '비율'을 내림차순으로, slice 개의 처음 3 행을 지정할 수 있습니다.

employ.data %>% 
     group_by(employee) %>% 
     arrange(desc(rate)) %>% 
     slice(1:3) 

또는 '직원'으로 그룹화 한 후 행을 서브 세트 rankfilter을 사용.

employ.data %>% 
    group_by(employee) %>% 
    filter(rank(-rate) <4) 
#  employee rate place 
# <fctr> <dbl> <fctr> 
#1  A 0.6 Dest2 
#2  A 0.7 Dest3 
#3  A 0.9 Dest6 
#4  B 0.8 Dest1 
#5  B 0.9 Dest2 
#6  B 0.7 Dest6 

아니면이`place` 열을 유지하려는 때문에 비록 중복이 아니다 @akrun 기본적으로 min_rank

employ.data %>% 
     group_by(employee) %>% 
     top_n(3, wt=rate) 
관련 문제