dplyr - Как отфильтровать верхние n групп с более (суммой) продаж? - PullRequest
0 голосов
/ 01 апреля 2019

Я использую dplyr на R и пытаюсь отфильтровать таблицу, содержащую данные транзакций.

Интересующие меня столбцы: «Страна» и «Продажи».

У меня естьмного стран, и для целей разведки я хочу проанализировать только ТОП-5 стран с наибольшим объемом продаж.

Проблема здесь в том, что если я сделаю какую-то группировку, это не сработает для меня, так как мне нужны всестроки для дальнейшего анализа (транзакционные данные).

Я пробовал что-то вроде:

trans_merch_df %>% group_by(COUNTRY) %>% top_n(n = 5, wt = NET_SLS_AMT)

Но он полностью выключен.

Допустим, у меня есть это:

trans_merch_df <- tibble::tribble(~COUNTRY, ~SALE,
                                  'POR',     14,
                                  'POR',     1,
                                  'DEU',     4,
                                  'DEU',     6,
                                  'POL',     8,
                                  'ITA',     1,
                                  'ITA',     1,
                                  'ITA',     1,
                                  'SPA',     1,
                                  'NOR',     50,
                                  'NOR',     10,
                                  'SWE',     42,
                                  'SWE',     1)

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

COUNTRY   SALE
POR       14
POR       1
DEU       4
DEU       6
POL       8
NOR       50
NOR       10
SWE       42
SWE       1

Поскольку ITA и SPA не входят в ТОП-5 продаж.

Заранее большое спасибо.

Ура!

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Другая возможность dplyr может быть:

df %>%
 add_count(COUNTRY, wt = SALE, name = "temp") %>%
 mutate(temp = dense_rank(desc(temp))) %>%
 filter(temp %in% 1:5) %>%
 select(-temp)


  COUNTRY  SALE
  <chr>   <int>
1 POR        14
2 POR         1
3 DEU         4
4 DEU         6
5 POL         8
6 NOR        50
7 NOR        10
8 SWE        42
9 SWE         1

или даже короче:

df %>%
 add_count(COUNTRY, wt = SALE, name = "temp") %>%
 filter(dense_rank(desc(temp)) %in% 1:5) %>%
 select(-temp)
1 голос
/ 01 апреля 2019

Вот подход с использованием соединения.

library(dplyr)
trans_merch_df %>% 
  # First figure the top 5 countries' by total sales, equiv to 
  #    group_by(COUNTRY) %>% summarize(n = sum(NET_SLS_AMT)
  count(COUNTRY, wt = SALE, sort = T) %>%    
  top_n(n = 5, wt = n) %>%

  # now add back orig data for those countries
  left_join(trans_merch_df)

#Joining, by = "COUNTRY"
## A tibble: 9 x 3
#  COUNTRY     n  SALE
#  <chr>   <int> <int>
#1 NOR        60    50
#2 NOR        60    10
#3 SWE        43    42
#4 SWE        43     1
#5 POR        15    14
#6 POR        15     1
#7 DEU        10     4
#8 DEU        10     6
#9 POL         8     8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...