将 R 数据帧过滤到 n 个最常见的情况并按频率排序
Filter R dataframe to n most frequent cases and order by frequency
在具有重复值的数据框中,我想要最常见的 n
个案例的行,比如两个最常出现的案例。下面的代码执行此操作,选择 x==3
或 x==4
和 return 行的行。
我不想使用值 5;但是,我想要某种方式以编程方式说明前 2 个最常见的 x 值,而不知道先验阈值(本例中为 5)。此外,我想按出现频率对生成的数据帧进行排序,因此 x==4
行排在 x==3
行之前。
我假设它与 count
、top_n
或 slice_max
和 arrange
有关,但也许不是!
任何有关如何使用 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))
在具有重复值的数据框中,我想要最常见的 n
个案例的行,比如两个最常出现的案例。下面的代码执行此操作,选择 x==3
或 x==4
和 return 行的行。
我不想使用值 5;但是,我想要某种方式以编程方式说明前 2 个最常见的 x 值,而不知道先验阈值(本例中为 5)。此外,我想按出现频率对生成的数据帧进行排序,因此 x==4
行排在 x==3
行之前。
我假设它与 count
、top_n
或 slice_max
和 arrange
有关,但也许不是!
任何有关如何使用 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))