dplyr - 分组并选择TOP x%

时间:2015-10-19 17:43:41

标签: r dplyr

使用包dplyr和函数sample_frac,可以从每个组中抽取百分比。我需要的是首先对每个组中的元素进行排序,然后从每个组中选择前x%?

有一个函数top_n,但在这里我只能确定行数,我需要一个相对值。

例如,以下数据按齿轮分组,并按每组中的wt排序:

library(dplyr)
mtcars %>%
  select(gear, wt) %>%
  group_by(gear) %>%
  arrange(gear, wt)

    gear    wt
1   3   2.465
2   3   3.215
3   3   3.435
4   3   3.440
5   3   3.460
6   3   3.520
7   3   3.570
8   3   3.730
9   3   3.780
10  3   3.840
11  3   3.845
12  3   4.070
13  3   5.250
14  3   5.345
15  3   5.424
16  4   1.615
17  4   1.835
18  4   1.935
19  4   2.200
20  4   2.320
21  4   2.620
22  4   2.780
23  4   2.875
24  4   3.150
25  4   3.190
26  4   3.440
27  4   3.440
28  5   1.513
29  5   2.140
30  5   2.770
31  5   3.170
32  5   3.570

现在我想在每个齿轮组中选择前20%。

如果解决方案可以与dplyr的group_by功能集成,那将是非常好的。

5 个答案:

答案 0 :(得分:18)

使用dplyr的另一个选项:

mtcars %>% select(gear, wt) %>% 
  group_by(gear) %>% 
  arrange(gear, desc(wt)) %>% 
  filter(wt > quantile(wt, .8))

Source: local data frame [7 x 2]
Groups: gear [3]

   gear    wt
  (dbl) (dbl)
1     3 5.424
2     3 5.345
3     3 5.250
4     4 3.440
5     4 3.440
6     4 3.190
7     5 3.570

答案 1 :(得分:8)

这是另一种方式

mtcars %>% 
  select(gear, wt) %>% 
  arrange(gear, desc(wt)) %>% 
  group_by(gear) %>% 
  slice(seq(n()*.2))

   gear    wt
  (dbl) (dbl)
1     3 5.424
2     3 5.345
3     3 5.250
4     4 3.440
5     4 3.440
6     5 3.570

我将“top”表示“具有wt的最高价值”并因此使用desc()

答案 2 :(得分:5)

我相信这会得到您正在寻找的答案。

library(dplyr)

mtcars %>% select(gear, wt) %>% 
  group_by(gear) %>% 
  arrange(gear, wt) %>% 
  filter(row_number() / n() <= .2)

答案 3 :(得分:0)

我知道这来晚了,但现在可能会对某人有所帮助。 dplyr具有新功能top_frac

  library(dplyr)
mtcars %>%
  select(gear, wt) %>%
  group_by(gear) %>%
  arrange(gear, wt) %>%
  top_frac(n = 0.2,wt = wt)

这里n是要返回的行的分数,wt是要用于排序的变量。

输出如下。

gear wt 3 5.250 3 5.345 3 5.424
4 3.440 4 3.440 5 3.570

答案 4 :(得分:0)

使用top_n和dplyr的方式略有不同:

mtcars %>% 
 group_by(gear) %>% 
 select(gear, wt) %>% 
 arrange(gear) %>% 
 top_n(seq(n()*.2))

  gear    wt
  <dbl> <dbl>
1     3  5.42
2     3  5.34
3     3  5.25
4     4  3.44
5     4  3.44
6     5  3.57