ID的前3个房价

时间:2016-08-24 19:11:35

标签: r dataframe dplyr aggregate

我试图找出员工排名前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

谢谢!

1 个答案:

答案 0 :(得分:1)

按“员工”进行分组后,我们可以按降序排列arrange'费率',前3行slice

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

或者使用filterrank对“员工”进行分组后对行进行分组。

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)