Select 变量中出现次数最多的 n 个值

Select the n most frequent values in a variable

我想在数据框中的列中找到最常见的值。我假设使用 table 是最好的方法?然后我想 filter/subset 我的数据框只包含这些前 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

然后我将 select ID A 和 C 对应的行:

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

我们可以使用 tablesort 顺序 decreasing 和 select 前 2(或 10)个值来计算值的数量,得到相应的 ID's 并从数据框中对 ID's 进行子集化。

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

你可以试试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)

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

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