dplyr - 如何筛选出销售额更多(总和)的前 n 个组?
dplyr - How to filter the top n groups with more (sum) sales?
我在 R 上使用 dplyr,我正在尝试过滤包含交易数据的 tibble。
我感兴趣的列是 "Country" 和 "Sales"。
我有很多国家,出于探索目的,我只想分析销量最高的前 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。
非常感谢。
干杯!
这是一种使用联接的方法。
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
另一种 dplyr
可能性是:
df %>%
add_count(COUNTRY, wt = SALE) %>%
mutate(n = dense_rank(desc(n))) %>%
filter(n %in% 1:5) %>%
select(-n)
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) %>%
filter(dense_rank(desc(n)) %in% 1:5) %>%
select(-n)
我在 R 上使用 dplyr,我正在尝试过滤包含交易数据的 tibble。
我感兴趣的列是 "Country" 和 "Sales"。
我有很多国家,出于探索目的,我只想分析销量最高的前 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。
非常感谢。
干杯!
这是一种使用联接的方法。
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
另一种 dplyr
可能性是:
df %>%
add_count(COUNTRY, wt = SALE) %>%
mutate(n = dense_rank(desc(n))) %>%
filter(n %in% 1:5) %>%
select(-n)
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) %>%
filter(dense_rank(desc(n)) %in% 1:5) %>%
select(-n)