2016-08-24 8 views
1

私は従業員の上位3つの料金を把握しようとしていますが、その場所の列は保持しています。トップ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

「employee」でグループ化した後、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) 
関連する問題