首页 > 解决方案 > 如何使用 dplyr 跨 R 中的多个列进行聚合

问题描述

我有以下数据框:

data = data.frame(store=c('A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B'),
prod_id=c('p1','p1','p2','p2','p2','p1','p1','p1','p2','p2','p1','p1','p1','p2','p2','p2','p1','p1','p2','p2'),
Date=c('2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-02','2017-01-02','2017-01-02','2017-01-02','2017-01-02','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-01','2017-01-02','2017-01-02','2017-01-02','2017-01-02'),
sales=c('12','13','15','10','12','9','12','8','7','11','10','1','5','9','6','7','1','4','1','5'))

data

     store prod_id  Date    sales
1      A      p1 2017-01-01    12
2      A      p1 2017-01-01    13
3      A      p2 2017-01-01    15
4      A      p2 2017-01-01    10
5      A      p2 2017-01-01    12
6      A      p1 2017-01-02     9
7      A      p1 2017-01-02    12
8      A      p1 2017-01-02     8
9      A      p2 2017-01-02     7
10     A      p2 2017-01-02    11
11     B      p1 2017-01-01    10
12     B      p1 2017-01-01     1
13     B      p1 2017-01-01     5
14     B      p2 2017-01-01     9
15     B      p2 2017-01-01     6
16     B      p2 2017-01-01     7
17     B      p1 2017-01-02     1
18     B      p1 2017-01-02     4
19     B      p2 2017-01-02     1
20     B      p2 2017-01-02     5

我想汇总 store-prod_id-Date 的销售额以获取汇总数据,如下所示:

>data_aggregate

   store prod_id   Date     sales
1     A      p1 2017-01-01    15
2     A      p2 2017-01-01    37
3     A      p1 2017-01-02    29
4     A      p2 2017-01-02    18
5     B      p1 2017-01-01    16
6     B      p2 2017-01-01    22
7     B      p1 2017-01-02     5
8     B      p2 2017-01-02     6

如何使用 dplyr 或 R 中的任何其他聚合方法来实现上述聚合?

标签: rdplyraggregate

解决方案


像下面这样使用aggregate

> aggregate(cbind(sales = as.numeric(sales))~.,data,sum)
  store prod_id       Date             sales
1     A      p1 2017-01-01                25
2     B      p1 2017-01-01                16
3     A      p2 2017-01-01                37
4     B      p2 2017-01-01                22
5     A      p1 2017-01-02                29
6     B      p1 2017-01-02                 5
7     A      p2 2017-01-02                18
8     B      p2 2017-01-02                 6

推荐阅读