使用包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
功能集成,那将是非常好的。
答案 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