数据框通过分组选择顶部

时间:2018-05-14 14:05:27

标签: r dataframe dplyr grouping

我有一个数据框,例如:

set.seed(1)
df <- data.frame(
  sample = 1:50,
  value = runif(50),
  group = c(rep(NA, 20), gl(3, 10)))

我想根据价值选择前10个样本。但是,如果存在与样本对应的组,我只想包含该组中的一个样本。如果group == NA,我想要包含所有这些。按值排列df如下:

df_top <- df %>% 
  arrange(-value) %>% 
  top_n(10, value)

   sample     value group
1      46 0.7973088     3
2      49 0.8108702     3
3      22 0.8394404     1
4       2 0.8612095    NA
5      27 0.8643395     1
6      20 0.8753213    NA
7      44 0.8762692     3
8      26 0.8921983     1
9      11 0.9128759    NA
10     30 0.9606180     1

我希望在我的数据框中包含样本36,22,2,20,11以及接下来的五个最高值,这些值继续适合该模式。我该如何做到这一点?

2 个答案:

答案 0 :(得分:2)

我想我想出来了。这是最好的方式吗?

df_top <- df %>% 
  arrange(-value) %>% 
  group_by(group) %>% 
  filter(ifelse(!is.na(group), value == max(value), value == value)) %>% 
  ungroup() %>%
  top_n(10, value)

# A tibble: 10 x 3
   sample value group
    <int> <dbl> <int>
 1     18 0.992    NA
 2      7 0.945    NA
 3     21 0.935     1
 4      4 0.908    NA
 5      6 0.898    NA
 6     35 0.827     2
 7     41 0.821     3
 8     20 0.777    NA
 9     15 0.770    NA
10     17 0.718    NA

答案 1 :(得分:0)

使用slice代替filter的类似方法:

library(dplyr)

df_top <- df %>%
  arrange(-value) %>%
  group_by(group) %>%
  slice(if(any(!is.na(group))) 1 else 1:n()) %>%
  ungroup() %>%
  top_n(10, value)

<强>结果:

# A tibble: 10 x 3
   sample     value group
    <int>     <dbl> <int>
 1     21 0.9347052     1
 2     35 0.8273733     2
 3     41 0.8209463     3
 4     18 0.9919061    NA
 5      7 0.9446753    NA
 6      4 0.9082078    NA
 7      6 0.8983897    NA
 8     20 0.7774452    NA
 9     15 0.7698414    NA
10     17 0.7176185    NA