将 R 数据帧过滤到 n 个最常见的情况并按频率排序

Filter R dataframe to n most frequent cases and order by frequency

在具有重复值的数据框中,我想要最常见的 n 个案例的行,比如两个最常出现的案例。下面的代码执行此操作,选择 x==3x==4 和 return 行的行。

我不想使用值 5;但是,我想要某种方式以编程方式说明前 2 个最常见的 x 值,而不知道先验阈值(本例中为 5)。此外,我想按出现频率对生成的数据帧进行排序,因此 x==4 行排在 x==3 行之前。

我假设它与 counttop_nslice_maxarrange 有关,但也许不是!

任何有关如何使用 dplyr 执行此操作的提示都将不胜感激。

require(tidyverse)
adf <- data.frame(x=c(rep(2,5),rep(3,7), rep(4,9), 1), y=1:22)
adf %>% group_by(x) %>% filter(n() > 5)

我们可以通过使用 n() 计算每个组的大小然后对其进行过滤来做到这一点。如果你想让它们按顺序排列,也可以使用 dplyr::arrange().

library(dplyr)

adf %>%
  group_by(x) %>%
  mutate(size = n()) %>%
  ungroup() %>%
  filter(size >= sort(unique(size), TRUE)[2]) %>%
  arrange(desc(size))
#> # A tibble: 16 × 3
#>        x     y  size
#>    <dbl> <int> <int>
#>  1     4    13     9
#>  2     4    14     9
#>  3     4    15     9
#>  4     4    16     9
#>  5     4    17     9
#>  6     4    18     9
#>  7     4    19     9
#>  8     4    20     9
#>  9     4    21     9
#> 10     3     6     7
#> 11     3     7     7
#> 12     3     8     7
#> 13     3     9     7
#> 14     3    10     7
#> 15     3    11     7
#> 16     3    12     7

这是另一个 tidyverse 选项,我使用 add_count 获取每组的观察数,然后我 filter 具有最多观察数的 2 个组。然后,我arrange按出现频率

library(tidyverse)

adf %>%
  add_count(x) %>% 
  filter(n %in% tail(sort(unique(n)),2)) %>% 
  arrange(desc(n))

输出

   x  y n
1  4 13 9
2  4 14 9
3  4 15 9
4  4 16 9
5  4 17 9
6  4 18 9
7  4 19 9
8  4 20 9
9  4 21 9
10 3  6 7
11 3  7 7
12 3  8 7
13 3  9 7
14 3 10 7
15 3 11 7
16 3 12 7

数据

adf <- structure(list(x = c(2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 1), y = 1:22), class = "data.frame", row.names = c(NA, 
-22L))