首页 > 解决方案 > 通过分组选择顶部的数据框

问题描述

我有一个数据框,例如:

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 和接下来的五个最高值,这些值继续符合模式。我该如何做到这一点?

标签: rdataframedplyrgrouping

解决方案


我想我想通了。这会是最好的方法吗:

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

推荐阅读