【问题标题】:Select the n most frequent values in a variable选择变量中出现频率最高的 n 个值
【发布时间】:2018-08-13 09:18:26
【问题描述】:

我想在数据框中的列中查找最常见的值。我认为使用table 是最好的方法吗?然后我想过滤/子集我的数据框以仅包含这些前 n 个值。

我的数据框的一个例子如下。在这里我想找到例如前 2 个 ID。

ID    col
A     blue
A     purple
A     green
B     green
B     red
C     red
C     blue
C     yellow
C     orange

因此我想输出以下内容:

Top 2 values of ID are:
A and C

然后我会选择 ID A 和 C 对应的行:

ID    col
A     blue
A     purple
A     green
C     red
C     blue
C     yellow
C     orange

【问题讨论】:

    标签: r filter count top-n


    【解决方案1】:

    您可以尝试tidyverse。将ID 的计数相加,然后过滤出前两个(使用< 3)或前十(使用< 11):

    library(tidyverse)
    d %>% 
      add_count(ID) %>% 
      filter(dense_rank(-n) < 3)
    # A tibble: 7 x 3
      ID    col        n
      <fct> <fct>  <int>
    1 A     blue       3
    2 A     purple     3
    3 A     green      3
    4 C     red        4
    5 C     blue       4
    6 C     yellow     4
    7 C     orange     4
    

    数据

    d <- read.table(text="ID    col
    A     blue
                    A     purple
                    A     green
                    B     green
                    B     red
                    C     red
                    C     blue
                    C     yellow
                    C     orange", header=T)
    

    【讨论】:

      【解决方案2】:

      我们可以使用tablesortdecreasing 的顺序计算值的数量并选择前2(或10)个值,获取相应的ID 并将这些ID 子集化从数据框中。

      df[df$ID %in% names(sort(table(df$ID), decreasing = TRUE)[1:2]), ]
      
      #  ID    col
      #1  A   blue
      #2  A purple
      #3  A  green
      #6  C    red
      #7  C   blue
      #8  C yellow
      #9  C orange
      

      【讨论】:

      • 哈!走的是同一条路:top_n_value = 2;df1 %&gt;% filter(ID %in% (table(ID) %&gt;% sort(decreasing=T) %&gt;% .[1:top_n_value] %&gt;% names)) - 1up 住宿base
      【解决方案3】:

      使用 tidyverse 及其top_n

      library(tidyverse)
      d %>%
        group_by(ID) %>%
        summarise(n()) %>%
        top_n(2)
      
      Selecting by n()
      # A tibble: 2 x 2
      ID    `n()`
      <fct> <int>
      1 A         3
      2 C         4
      

      完成子集:

      d %>%
        group_by(ID) %>%
        summarise(n()) %>%
        top_n(2) %>% 
        { filter(d, ID %in% .$ID) }
      
      Selecting by n()
      ID    col
      1  A   blue
      2  A purple
      3  A  green
      4  C    red
      5  C   blue
      6  C yellow
      7  C orange
      

      (我们使用大括号是因为我们不将左侧结果作为过滤器的第一个参数)

      【讨论】:

      • 这不是 OP 想要的。请检查预期的输出。
      • “因此我想输出以下内容:ID 的前 2 个值是:A 和 C”。我添加了子集,虽然它不是问题的本质......
      猜你喜欢
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多