【问题标题】:select multiple rows from a dataframe with a value equal to highest value by group从数据框中选择多行,其值等于按组的最大值
【发布时间】:2017-10-20 22:25:43
【问题描述】:

我有一个如下所示的数据框:

query <- c('a','a','a','b','b','b','c','c','c')
hit <- c(1,2,3,4,5,6,7,8,9)
score <- c(97,97,96,98,97,96,99,99,98)
df <- data.frame(query,hit,score)
df

  query hit score
1     a   1    97
2     a   2    97
3     a   3    96
4     b   4    98
5     b   5    97
6     b   6    96
7     c   7    99
8     c   8    99
9     c   9    98

我想对第一列进行分组,然后选择所有得分等于该组最高分的行。我能想到的最接近的方法是像这样使用 top_n:

df %>%
+ group_by(query) %>%
+ top_n(2,score)

小标题:6 x 3

组:查询 [3]

   query   hit score
  <fctr> <dbl> <dbl>
1      a     1    97
2      a     2    97
3      b     4    98
4      b     5    97
5      c     7    99
6      c     8    99

但显然,我所做的只是给了我前两个(或我指定的任何内容)。我想最终得到的结果看起来更像这样:

   query   hit score
  <fctr> <dbl> <dbl>
1      a     1    97
2      a     2    97
3      b     4    98
5      c     7    99
6      c     8    99

像往常一样,我认为我遗漏了一些非常简单的东西。

【问题讨论】:

    标签: r dataframe dplyr tidyverse


    【解决方案1】:

    dplyr 中,只需过滤 score == max(score):

    group_by(df, query) %>%
        filter(score == max(score))
    # A tibble: 5 x 3
    # Groups:   query [3]
    #    query   hit score
    #   <fctr> <dbl> <dbl>
    # 1      a     1    97
    # 2      a     2    97
    # 3      b     4    98
    # 4      c     7    99
    # 5      c     8    99
    

    您也可以在 base R 中轻松做到这一点,使用 ave():

    df[with(df, ave(score, query, FUN = max) == score), ]
    #   query hit score
    # 1     a   1    97
    # 2     a   2    97
    # 4     b   4    98
    # 7     c   7    99
    # 8     c   8    99
    

    【讨论】:

      【解决方案2】:

      您的语法基本正确,只需在top_n 中指定n = 1 而不是n = 2

      query <- c('a','a','a','b','b','b','c','c','c')
      hit <- c(1,2,3,4,5,6,7,8,9)
      score <- c(97,97,96,98,97,96,99,99,98)
      df <- data.frame(query,hit,score)
      
      df %>%
        group_by(query) %>%
        top_n(n = 1, wt = score)
      #> # A tibble: 5 x 3
      #> # Groups:   query [3]
      #>    query   hit score
      #>   <fctr> <dbl> <dbl>
      #> 1      a     1    97
      #> 2      a     2    97
      #> 3      b     4    98
      #> 4      c     7    99
      #> 5      c     8    99
      

      使用top_n 时,如果出现平局,将返回所有具有该分数的观察结果。因此,您可以指定要获得最高分 1 (n = 1),然后将返回每个组中具有该分数的所有观察结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多