R 使用多个分组变量创建数据帧

R 使用多个分组变量创建数据帧,r,R,我有一个包含变量的表: 订单发布年份、订单发布月份、产品系列、销售、数量。现在我想创建一个数据框来显示一个表,其中行作为每个ProductFamily(分组),列作为每个OrderPostingYear&OrderPostingMonth(分组),值是销售额的总和。我该怎么做 >ProductTable OrderPostingYear OrderPostingMonth ProductsFamily Sales QTY 2008 1

我有一个包含变量的表: 订单发布年份、订单发布月份、产品系列、销售、数量。现在我想创建一个数据框来显示一个表,其中行作为每个ProductFamily(分组),列作为每个OrderPostingYear&OrderPostingMonth(分组),值是销售额的总和。我该怎么做

>ProductTable
 OrderPostingYear OrderPostingMonth ProductsFamily Sales QTY
2008               1                 R1            5234   1
2008               1                 R2            223    2
2009               1                 R3            34     1 
2008               2                 R1            1634   3
2010               4                 R3            224    1 
结果应该如下所示:

>PFTable
      2008-1 2008-2 2009-1 2010-4
R1     5234    1634    0     0
R2     223     0       0     0
R3     0       0       34    224
我正在考虑使用group_by,并在dplyr中对每个人进行总结,但不是成功。我需要帮助。谢谢大家!

PFTable<-data.frame(ProductTable%>%
                   group_by(ProductFamily) %>%                                summarise_each(.,funs(sum(SalesVolume,na.rm=TRUE)),group_by(OrderPostingYear,OrderPostingMonth)))
PFTable%
分组依据(ProductFamily)%>%总结每个(,funs(总和(销售额,na.rm=TRUE)),分组依据(OrderPostingYear,OrderPostingMonth)))

我们可以使用
acast
将“长”格式改为“宽”格式

library(reshape2)
acast(ProductTable, ProductsFamily~OrderPostingYear+OrderPostingMonth, 
             value.var='Sales', fill=0) 
#   2008_1 2008_2 2009_1 2010_4
#R1   5234   1634      0      0
#R2    223      0      0      0
#R3      0      0     34    224

如果我们想使用
dplyr/tidyr
,那么
unite
将“OrderPostingYear”和“OrderPostingMonth”合并,删除“QTY”和
spread
以将“long”改形为“wide”

library(dplyr)
library(tidyr)
unite(df1, OrderMonth, OrderPostingYear, OrderPostingMonth, sep="-") %>%
               select(-QTY) %>%
               spread(OrderMonth, Sales)

非常感谢。但是我想通过“ProductFamily”和“OrderPostingYear&OrderPostingMonth”来创建值为SUM的表。不仅仅是删除数量。@HersheyY我的解决方案是基于您显示的预期输出。如果您需要
sum
,则在
acast/dcast
中有fun.aggregate指定
sum
,即
acast(ProductTable,ProductsFamily~OrderPostingYear+OrderPostingMonth,value.var='Sales',fill=0,sum)