R中为每个商家出售的前n个产品

时间:2017-05-22 15:50:16

标签: r dplyr

我读过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       |

1 个答案:

答案 0 :(得分:1)

您需要稍微修改一下代码。您希望对按top_n分组的数据执行merchant_id,而不是按(product_id, merchant_id)分组的数据执行,因此您应该在再次分组之前取消分组。 另外,如果您希望arrangemerchant_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个值。