【问题标题】:how to select top n values from a data frame retaining the duplicates in r如何从保留r中的重复项的数据框中选择前n个值
【发布时间】:2016-02-04 12:45:07
【问题描述】:

假设我的示例数据如下所示。

   id freq
    1    4
    2    3
    3    2
    4    2
    5    1

freq 列告诉每个 id 的频率。问题是:我想要前 3 个频率。输出应该是..

   id freq
    1    4
    2    3
    3    2
    4    2

我使用了以下代码。

d$rank <- rank(-d$freq,ties.method="min")

d 是我的数据框。我使用了rank 命令,以便我以后可以选择前 3 个频率。 我得到的输出是:

id freq rank
 1    4    1
 2    3    2
 3    2    3
 4    2    3
 5    1    5

问题是缺少 rank 4。我希望连续排名来处理原始数据框中的许多重复值。任何帮助表示赞赏。

谢谢。

【问题讨论】:

    标签: r rank


    【解决方案1】:

    这是另一种基本的 R 方法:

    df[cumsum(!duplicated(df$freq))<4,]
    #  id freq
    #1  1    4
    #2  2    3
    #3  3    2
    #4  4    2
    

    这假设数据已经按降序排列(如示例中所示)。

    如果您要使用 dplyr 等外部库,我建议您使用 top_n:

    library(dplyr)
    top_n(df, 3, freq)
    #  id freq
    #1  1    4
    #2  2    3
    #3  3    2
    #4  4    2
    

    【讨论】:

      【解决方案2】:

      假设'freq'按降序排列,我们得到'freq'的unique元素,用head选择前3个,使用%in%得到那些元素的逻辑索引'freq' 列,subset 行。

      subset(df1, freq %in% head(unique(freq),3))
      #  id freq
      #1  1    4
      #2  2    3
      #3  3    2
      #4  4    2
      

      如果我们使用rank,那么dplyr 中的dense_rank 将是一个选项

      library(dplyr)
      df1 %>%
          filter(dense_rank(-freq) < 4)
      

      或者使用来自data.tablefrank 的另一个选项(由@David Arenburg 提供),

      library(data.table)
      setDT(df)[, .SD[frank(-freq, ties.method = "dense") < 4]]
      

      【讨论】:

        猜你喜欢
        • 2015-12-08
        • 2020-08-06
        • 2015-10-05
        • 2021-07-11
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        相关资源
        最近更新 更多