我读过dplyr文档但仍然无法理解group_by方法。我试图找到每个商家(merchant_id)销售的前3个产品(product_id)。我试过的代码是以下
tmp <- orders %>%
group_by(product_id, merchant_id) %>%
summarize(count = n()) %>%
top_n(3, wt = count) %>%
arrange(desc(count))
如果商家销售的产品少于3种,我希望他们能够展示相应数量的产品。
INPUT
order_id | product_id | merchant_id |
---------|------------|-------------|
23409 | 131883 | 597 |
23683 | 131885 | 597 |
25325 | 131885 | 597 |
25390 | 131885 | 597 |
25410 | 131888 | 597 |
25325 | 223783 | 613 |
28932 | 223815 | 613 |
38197 | 298483 | 613 |
48728 | 298483 | 613 |
如果我要为每个产品找到前3个产品,我希望输出为(计数数字在示例中不匹配,因为我必须创建多个行,但格式将如此)
输出
count | product_id | merchant_id |
---------|------------|-------------|
5 | 131883 | 597 |
3 | 131885 | 597 |
2 | 131888 | 597 |
4 | 223783 | 613 |
2 | 223815 | 613 |
1 | 298483 | 613 |
答案 0 :(得分:1)
您需要稍微修改一下代码。您希望对按top_n
分组的数据执行merchant_id
,而不是按(product_id, merchant_id)
分组的数据执行,因此您应该在再次分组之前取消分组。
另外,如果您希望arrange
对merchant_id
组内的计数进行排序,则还应指定它。
orders %>%
group_by(product_id, merchant_id) %>%
summarize(count = n()) %>%
ungroup() %>%
group_by(merchant_id) %>%
top_n(3, wt = count) %>%
arrange(merchant_id,desc(count))
返回:
product_id merchant_id count
<int> <int> <int>
1 131885 597 3
2 131883 597 1
3 131888 597 1
4 298483 613 2
5 223783 613 1
6 223815 613 1
另请注意,如果存在关联,top_n
可以返回超过n个值。