Отфильтруйте верхние n самых больших групп в data.frame - PullRequest
5 голосов
/ 29 мая 2019

Для данных примера:

set.seed(2222)
example_data <- data.frame(col1 = 1:15,
                           col2 = 16:30, 
                           group = sample(1:3, 15, replace = TRUE))

   col1 col2 group
1     1   16     2
2     2   17     1
3     3   18     3
4     4   19     2
5     5   20     3
6     6   21     1
7     7   22     3
8     8   23     1
9     9   24     3
10   10   25     1
11   11   26     2
12   12   27     2
13   13   28     2
14   14   29     3
15   15   30     3

Я хочу найти n верхних групп с наибольшим количеством записей.

Допустим, я хочу получить 2 верхние группы снаибольшее количество записей.В данных это группы 3 и 2:

example_data %>% 
  group_by(group) %>% 
  summarise(n = n())

# A tibble: 3 x 2
  group     n
  <int> <int>
1     1     4
2     2     5
3     3     6

Ожидаемый результат:

   col1 col2 group
1     1   16     2
2     3   18     3
3     4   19     2
4     5   20     3
5     7   22     3
6     9   24     3
7    11   26     2
8    12   27     2
9    13   28     2
10   14   29     3
11   15   30     3

Ответы [ 5 ]

4 голосов
/ 29 мая 2019

Мы можем использовать table для расчета частоты для каждого group, sort их в порядке decreasing, подмножества 2 верхних записей и filter соответствующих групп.

library(dplyr)

example_data %>%
   filter(group %in% names(sort(table(group), decreasing = TRUE)[1:2]))


#   col1 col2 group
#1     1   16     2
#2     3   18     3
#3     4   19     2
#4     5   20     3
#5     7   22     3
#6     9   24     3
#7    11   26     2
#8    12   27     2
#9    13   28     2
#10   14   29     3
#11   15   30     3

Также вы можете напрямую использовать это в базе R subset

subset(example_data, group %in% names(sort(table(group), decreasing = TRUE)[1:2]))
3 голосов
/ 29 мая 2019

Мы можем использовать tidyverse методы для этого.Создайте столбец частоты с add_count, arrange по этому столбцу и filter строками, в которых «группа» находится в последних двух unique значениях «группы»

library(dplyr)
example_data %>% 
   add_count(group) %>% 
   arrange(n) %>%
   filter(group %in% tail(unique(group), 2)) %>%
   select(-n)
# A tibble: 11 x 3
#    col1  col2 group
#  <int> <int> <int>
# 1     1    16     2
# 2     4    19     2
# 3    11    26     2
# 4    12    27     2
# 5    13    28     2
# 6     3    18     3
# 7     5    20     3
# 8     7    22     3
# 9     9    24     3
#10    14    29     3
#11    15    30     3

Или используя data.table

library(data.table)
setDT(example_data)[group %in% example_data[, .N, group][order(-N), head(group, 2)]]
2 голосов
/ 29 мая 2019

С dplyr вы также можете сделать:

example_data %>%
 add_count(group) %>%
 filter(dense_rank(desc(n)) <= 2) %>%
 select(-n)

   col1  col2 group
   <int> <int> <int>
 1     1    16     2
 2     3    18     3
 3     4    19     2
 4     5    20     3
 5     7    22     3
 6     9    24     3
 7    11    26     2
 8    12    27     2
 9    13    28     2
10    14    29     3
11    15    30     3

или:

example_data %>%
 add_count(group) %>%
 slice(which(dense_rank(desc(n)) <= 2)) %>%
 select(-n)
1 голос
/ 29 мая 2019

Другой dplyr метод может быть:

example_data %>% 
  group_by(group) %>% 
  count() %>% 
  ungroup() %>% 
  top_n(n = 2, wt = n) %>% 
  select(-n) %>% 
  inner_join(example_data)
0 голосов
/ 29 мая 2019

Еще одно решение (похожее на @OTStats):

library(dplyr)

example_data %>% 
  inner_join(
    count(., group) %>% top_n(2, n) %>% dplyr::select(group)
    )

#    col1 col2 group
# 1     1   16     2
# 2     3   18     3
# 3     4   19     2
# 4     5   20     3
# 5     7   22     3
# 6     9   24     3
# 7    11   26     2
# 8    12   27     2
# 9    13   28     2
# 10   14   29     3
# 11   15   30     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...