我试图找出员工排名前3位的费率,但保留位置列。
这就是一切:
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
提取前三个费率,并保留place
列。我知道group_by
中的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 :(得分:1)
按“员工”进行分组后,我们可以按降序排列arrange
'费率',前3行slice
。
employ.data %>%
group_by(employee) %>%
arrange(desc(rate)) %>%
slice(1:3)
或者使用filter
与rank
对“员工”进行分组后对行进行分组。
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
或top_n
基本上是filter
min_rank
employ.data %>%
group_by(employee) %>%
top_n(3, wt=rate)