【问题标题】:data frame selecting top by grouping通过分组选择顶部的数据框
【发布时间】:2018-10-24 05:35:06
【问题描述】:

我有一个数据框,例如:

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

【问题讨论】:

    标签: r dataframe dplyr grouping


    【解决方案1】:

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

    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
    

    【讨论】:

    • 好一个。如果您认为这是最好的答案,您可以接受自己的答案。
    • 实际上我的答案适用于我的示例,但不适用于我的真实数据集;我还没弄清楚为什么。
    • 嗯,你能提供一个更能反映你真实数据的样本数据集吗?
    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多