【问题标题】:Top 3 Rates by ID按 ID 排名前 3 位的费率
【发布时间】:2016-08-24 19:11:34
【问题描述】:

我正在尝试按员工计算前 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)

数据框如下所示:

   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 中执行group_by,但这将消除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

谢谢!

【问题讨论】:

  • @akrun 它不是重复的,因为我想保留place 列。我已经知道如何使用group_by了。
  • 对不起。我重新打开它并发布了一个解决方案。请检查。

标签: r dataframe dplyr aggregate


【解决方案1】:

按'employee'分组后,我们可以arrange'rate'按降序排列,slice前3行。

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 基本上是filtermin_rank 的包装

employ.data %>%
       group_by(employee) %>%
       top_n(3, wt=rate)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多