我有一个数据框是交付记录。如何创建一个汇总数据框,其中包含列数月,客户#行数和每月数量总和?
> my.data
yr mo cust qty
1 2010 6 2005161 620448
2 2009 5 29290 533000
3 2011 6 51800 125000
4 2011 7 2005149 677856
5 2009 5 51888 128000
6 2011 1 290913 51400
7 2010 9 2075516 352800
8 2011 11 34029 574200
9 2009 11 40740 734740
10 2011 10 2016135 300209
11 2011 5 2000294 605300
12 2010 3 34004 675200
13 2011 2 2030823 610236
14 2011 12 2016188 682000
15 2010 7 23409 85000
16 2011 1 2089839 188000
17 2011 11 34414 455658
18 2011 7 2004149 166200
19 2011 11 40404 235000
20 2009 7 203203 531000
答案 0 :(得分:2)
library(reshape2)
dcast(my.data, formula = cust ~ mo, fun.aggregate = sum, value.var = "qty")
答案 1 :(得分:1)
如果你想要每个月的数量总和,你可以做这样的事情。 mydf
是my.data
。您可以使用spread
包中的tidyr
转换数据。然后,使用addmargins
添加数量总和的行,这需要表或数组。您将其转换为data.frame。最后,您将yr
和cuts
的无意义总和更改为NA
。
library(tidyr)
foo <- as.data.frame(addmargins(as.matrix(spread(mydf, mo, qty, fill = 0)),
1, FUN = list(total = 'sum')))
foo[nrow(foo), c(1:2)] <- NA
或者,您也可以这样做。
ana <- spread(mydf, mo, qty, fill = 0)
ana[nrow(ana)+1, ] <- colSums(ana)
ana[nrow(ana), c(1:2)] <- NA
# yr cust 1 2 3 5 6 7 9 10 11 12
#1 2009 29290 0 0 0 533000 0 0 0 0 0 0
#2 2009 40740 0 0 0 0 0 0 0 0 734740 0
#3 2009 51888 0 0 0 128000 0 0 0 0 0 0
#4 2009 203203 0 0 0 0 0 531000 0 0 0 0
#5 2010 23409 0 0 0 0 0 85000 0 0 0 0
#6 2010 34004 0 0 675200 0 0 0 0 0 0 0
#7 2010 2005161 0 0 0 0 620448 0 0 0 0 0
#8 2010 2075516 0 0 0 0 0 0 352800 0 0 0
#9 2011 34029 0 0 0 0 0 0 0 0 574200 0
#10 2011 34414 0 0 0 0 0 0 0 0 455658 0
#11 2011 40404 0 0 0 0 0 0 0 0 235000 0
#12 2011 51800 0 0 0 0 125000 0 0 0 0 0
#13 2011 290913 51400 0 0 0 0 0 0 0 0 0
#14 2011 2000294 0 0 0 605300 0 0 0 0 0 0
#15 2011 2004149 0 0 0 0 0 166200 0 0 0 0
#16 2011 2005149 0 0 0 0 0 677856 0 0 0 0
#17 2011 2016135 0 0 0 0 0 0 0 300209 0 0
#18 2011 2016188 0 0 0 0 0 0 0 0 0 682000
#19 2011 2030823 0 610236 0 0 0 0 0 0 0 0
#20 2011 2089839 188000 0 0 0 0 0 0 0 0 0
#total NA NA 239400 610236 675200 1266300 745448 1460056 352800 300209 1999598 682000