2015-10-01 59 views
2

我有一個包含變量的表: OrderPostingYear,OrderPostingMonth,ProductsFamily,Sales,QTY。現在我想要創建一個數據框來顯示一個表,其中包含每個ProductFamily(分組)和每個OrderPostingYear OrderPostingMonth(分組)的列,值是Sales的總和。我會怎麼做?創建具有多個分組變量的數據框

>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和summarise_each在dplyr但沒有成功。需要幫助。謝謝!

PFTable<-data.frame(ProductTable%>% 
        group_by(ProductFamily) %>%        summarise_each(.,funs(sum(SalesVolume,na.rm=TRUE)),group_by(OrderPostingYear,OrderPostingMonth))) 

回答

1

我們可以使用acast將'long'重新整形爲'wide'格式。

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」,去掉「數量」和spread從「長」到「寬」重塑。

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

謝謝。但是我希望通過「ProductFamily」和「OrderPostingYear&OrderPostingMonth」來獲得SUM值的表格。不只是刪除數量。 –

+0

@HersheyY我的解決方案基於您展示的預期輸出。如果你想要'sum',那麼在'acast/dcast'中有fun.aggregate來指定'sum',也就是'acast(ProductTable,ProductsFamily〜OrderPostingYear + OrderPostingMonth, value.var ='Sales',fill = 0,sum )' – akrun

相關問題