dplyr выберите 10 лучших значений для каждой категории - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь отфильтровать фрейм данных, который содержит n строк для n категорий. Я хочу, чтобы значения каждой категории dimension сортировались по другому столбцу revenues, а затем отбирались первые 10 значений каждого dimension и избавлялись от остальных.

Я попытался с следующий выстрел, но он, кажется, не достигает того, чего я хочу:

data <-  tbl_df(data) %>%
  arrange(revenues) %>%
  group_by(dimension) %>%
  top_n(10)

Ответы [ 3 ]

2 голосов
/ 10 апреля 2020
data <-  tbl_df(data) %>%
  group_by(dimension) %>%
  arrange(revenues, .by_group = TRUE) %>%
  top_n(10)
1 голос
/ 10 апреля 2020

Мы можем проверить это на примере данных:

set.seed(100)
data = data.frame(revenues=rnbinom(100,mu=1000,size=1),
dimension=sample(letters[1:2],100,replace=TRUE))

Во-первых, как правильно указал @DarrenTsai, вам нужно указать столбец для выполнения top_n (). Во-вторых, когда вы используете top_n, он идет в порядке убывания и принимает записи с рангом 1-10:

data %>% top_n(10,revenues)
   revenues dimension
1      4191         b
2      1916         a
3      2397         b
4      1895         a
5      2013         a
6      2351         b
7      3889         b
8      2503         a
9      3909         a
10     2779         b

Это означает, что вам не нужно упорядочивать свои данные, и я не уверен, что вы намерены принять его по убыванию или по возрастанию. Давайте предположим, что он по убыванию:

data %>%  group_by(dimension) %>% top_n(10,revenues)

Обратите внимание, этот код, приведенный выше, примет 10 лучших значений, то есть в событиях связей (скажем, у вас 2 ранга 1), вы получите более 10. Для Пример в этих данных:

# A tibble: 21 x 2
# Groups:   dimension [2]
   revenues dimension
      <dbl> <fct>    
 1     1663 a        
 2     1663 a        
 3     1753 a        
 4     1849 a        
 5     1856 a        
 6     1869 a        
 7     1895 a        
 8     1916 a        
 9     2013 a        
10     2503 a        
# … with 11 more rows

Мы можем видеть, правильны ли результаты, это то, что мы ожидаем:

unlist(tapply(data$revenues,data$dimension,function(i)-sort(-i)[1:10]))
  a1   a2   a3   a4   a5   a6   a7   a8   a9  a10   b1   b2   b3   b4   b5   b6 
3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 4191 3889 2779 2397 2351 1479 
  b7   b8   b9  b10 
1414 1340 1327 1274 

И используя group_by + top_n():

 data %>%  group_by(dimension) %>% top_n(10,revenues) %>% 
arrange(dimension,desc(revenues)) %>% pull(revenues)
 [1] 3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 1663 4191 3889 2779 2397
[16] 2351 1479 1414 1340 1327 1274

Вы видите, что 1663 берется дважды, что дает 21 значение.

Если вам нужно абсолютно 20 (по 10):

data %>% arrange(desc(revenues)) %>%
group_by(dimension) %>% do(head(.,10))
1 голос
/ 10 апреля 2020
data <-  tbl_df(data) %>%
  group_by(dimension) %>%
  arrange(desc(revenues),.by_group=TRUE) %>%
  top_n(10,revenues)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...