R:计算列和&行作为来自数据帧的聚合 [英] R: calculating column sums & row sums as an aggregation from a dataframe
问题描述
我的初始数据框是:
Flag1 Flag2 Flag3 Type1 Type2 Type3
1 Level1 A FIRST 2 0 0
2 Level1 A SECOND 1 9 0
3 Level1 A第三3 7 0
4等级1 A第四十九18 0
5 Level1 A FIFTH 1 22 0
6 Level1 A SIXTH 1 13 0
7 Level1 B FIRST 0 0 0
8 Level1 B SECOND 3 9 0
9 Level1 B THIRD 5 85 0
10 Level1 B第四4 96 0
11 Level1 B FIFTH 3 40 0
12 Level1 B SIXTH 0 17 0
22 Level2 A FIRST 2 0 0
23 Level2 A SECOND 1 9 0
24 Level2 A第三3 7 0
25 Level2 A四十九18 0
26 Level2 A第一1 22 0
27 Level2 A第六十一13 0
28 Level2 B FIRST 0 0 0
29 Level2 B SECOND 3 9 0
30 Level2 B THIRD 5 85 0
31 Level2 B FOURTH 4 96 0
32 Level2 B FIFTH 3 40 0
33 Level2 B SIXTH 0 17 0
34 Level3 A FIRST 2 0 0
35 Level3 A SECOND 1 9 0
36 Level3 A THIRD 3 7 0
37级别3 A第四级9 18 0
38级别3 A第一级1 22 0
39级别3 A第六级1 13 0
40级别3 B第一级0 0 0
41级别3 B SECOND 3 9 0
42 Level3 B THIRD 5 85 0
43 Level 3 B四,4 96 0
44 Level3 B FIFTH 3 40 0
45 Level3 B SIXTH 0 17 0
我想要的结果是:
Flag1 Flag2 Flag3 Type1 Type2 Type3 Sum
1 Level1 A FIRST 2 0 0 2
2 Level1 A SECOND 1 9 0 12
3 Level1 A第三3 7 0 22
4级别1四分之一18 18 49
5 Level1 A FIFTH 1 22 0 72
6 Level1 A第六个1 13 0 86
7 Level1 B FIRST 0 0 0 0
8 Level1 B SECOND 3 9 0 12
9 Level1 B THIRD 5 85 0 102
10 Level1 B FOURTH 4 96 0 202
11 Level1 B FIFTH 3 40 0 245
12 Level1 B SIXTH 0 17 0 262
13 Level1(全部)FIRST 2 0 0 2
14 Level1(全部)SECOND 4 18 0 24
15 Level1(全部)THIRD 8 92 0 124
16 Level1(全部)第四十三114 0 251
17第1级(全部)第4章62 0 317
18级别1(全部)第六级1 30 0 348
19级别1 A(全部)17 68 0 85
20 Level1 B(全部)15 247 0 262
21等级1(全部)(全部)32 315 0 347
22等级2 A第一2 0 0 2
23等级2 A第一1 9 0 12
24等级2 A第三3 7 0 22
25级别2 A第四9 18 0 49
26级别2第一22 0 72
27 Level2 A SIXTH 1 13 0 86
28 Level2 B FIRST 0 0 0 0
29 Level2 B SECOND 3 9 0 12
30 Level2 B THIRD 5 85 0 102
31 Level2 B第四4 96 0 202
32 Level2 B FIFTH 3 40 0 245
33 Level2 B SIXTH 0 17 0 262
34 Level2(all)FIRST 2 0 0 2
35 Level2(全部)SECOND 4 18 0 24
36 Level2(全部)THIRD 8 92 0 124
37 Level2(全部)第四13 114 0 251
38 Level2全部)FIFTH 4 62 0 317
39 Level2(全部)第六个1 30 0 348
40 Level2 A(全部)17 68 0 85
41 Level2 B(全部)15 247 0 262
42 Level2(全部)(全部)32 315 0 347
43 Level3 A FIRST 2 0 0 2
44 Level3 A SECOND 1 9 0 12
45 Level3 A第三3 7 0 22
46 Level3 A四十九18 0 49
47 Level3 A第一1 22 0 72
48 Level 3 A第六1 13 0 86
49 Level 3 B FIRST 0 0 0 0
50 Level3 B SECOND 3 9 0 12
51 Level3 B THIRD 5 85 0 102
52 Level 3 B Four 4th 96 0 202
53 Level3 B FIFTH 3 40 0 245
54 Level3 B SIXTH 0 17 0 262
55 Level3(全部)FIRST 2 0 0 2
56 Level3(全部)SECOND 4 18 0 24
57级别3(全部)第三名8 92 0 124
58级别3(全部)第四十一级114 0 251
59级别3(全部)第四名62 62 317 317
60级3(全部)第六级1 30 0 348
61级别3 A(全部)17 68 0 85
62级别3 B(全部)15 247 0 262
63级别3(全部) 32 315 0 347
64(全部)A FIRST 6 0 0 6
65(全部)A SECOND 9 27 0 42
66(全部) A THIRD 18 48 0 108
67(全部)A第四45 102 0 255
68(全部)A第一48 168 0 471
69(全部)A第六51 207 0 729
70(全部)B FIRST 0 0 0 0
71(全部)B SECOND 9 27 0 36
72(全部)B THIRD 24 282 0 342
73(全部)B四36 570 0 948
74(全部)B FIFTH 45 690 0 1683
75(全部)B SIXTH 45 741 0 2469
76(全部)A(全部)51 552 0 1611
77(全)B(全)45 2310 0 5478
78(全)(全)(全)96 2862 0 7089
谢谢
这里不清楚你想要的,因为你提到 和以前的恩怨,但是如果你想要一个名为dfrm的数据框的colsums行,那么这个工作原理:
dfrm $ totals< - rowSums(dfrm [,4:6])
$ p $编辑:所以你确实想要行总和,然后在Flag1和Flag2的级别你想要的cumsums:
dfrmT< - rbind(dfrm,data.frame(Flag1 =all,Flag2 =all ,Flag3 =all,
t(colsums(dfrm [,4:7]))
))
dfrmT
(如果你想要多个小计,那是被回答的在你以前的问题。)
R:计算边距或行& col数据帧的总和dfrmT $ CS< - ave(dfrmT $ totals,list(dfrmT $ Flag1,dfrmT $ Flag2),FUN = cumsum)
dfrmT
Flag1 Flag2 Flag3 Type1 Type2 Type3总计CS
1 Level1 A FIRST 2 0 0 2 2
2 Level1 A SECOND 1 9 0 10 12
3 Level1 A第三3 7 0 10 22
4等级1 A第4 9 18 0 27 49
5等级1第一1 22 0 23 72
6 Level1 A第六个1 13 0 14 86
7 Level1 B FIRST 0 0 0 0 0
8 Level1 B SECOND 3 9 0 12 12
9 Level1 B THIRD 5 85 0 90 102
10级别1 B四级4 96 0 100 202
11级别1 B第三级3 40 0 43 245
12级别1 B第六级0 17 0 17 262
22级别2第一级2 0 0 2 2
23 Level2 A SECOND 1 9 0 10 12
24 Level2 A第三3 7 0 10 22
25 Level2 A第四十九18 0 27 49
26 Level2 A第一1 22 0 23 72
27 Level2 A第六个1 13 0 14 86
28 Level2 B FIRST 0 0 0 0 0
29 Level2 B SECOND 3 9 0 12 12
30 Level2 B THIRD 5 85 0 90 102
31 Level2 B FOURTH 4 96 0 100 202
32 Level2 B FIFTH 3 40 0 43 245
33 Level2 B SIXTH 0 17 0 17 262
34等级3 A FIRST 2 0 0 2 2
35 Level3 A SECOND 1 9 0 10 12
36 Level 3 A第三3 7 0 10 22
37 Level 3 A四十九18 0 27 49
38 Level 3 A FIFTH 1 22 0 23 72
39 Level3 A第六个1 13 0 14 86
40 Level3 B FIRST 0 0 0 0 0
41 Level3 B SECOND 3 9 0 12 12
42 Level3 B THIRD 5 85 0 90 102
341全部全部89 795 0 884 884
如果另一方面你想要在每个类型中的cumsums在新的Flag1和Flag2分区初始化,那么:
ave(dfrm [,grep(Type,names(dfrm))],list(dfrm $ Flag1,dfrm $ Flag2),FUN = cumsum)
Type1 Type2 Type3
1 2 0 0
2 3 9 0
3 6 16 0
4 15 34 0
5 16 56 0
6 17 69 0
7 0 0 0
8 3 9 0
9 8 94 0
10 12 190 0
11 15 230 0
12 15 247 0
22 2 0 0
23 3 9 0
24 6 16 0
25 15 34 0
26 16 56 0
27 17 69 0
28 0 0 0
29 3 9 0
30 8 94 0
31 12 190 0
32 15 230 0
33 15 247 0
34 2 0 0
35 3 9 0
36 6 16 0
37 15 34 0
38 16 56 0
39 17 69 0
40 0 0 0
41 3 9 0
42 8 94 0
这适合于cbind()到dfrm,但需要在names()上工作: p>
dfrmCS< - cbind(dfrm,ave(dfrm [,grep(Type,names(dfrm))],
列表(dfrm $ Flag1,dfrm $ Flag2),FUN = cumsum))
名称(dfrmCS)[8:10]< - 粘贴(名称(dfrmCS)[8:10],CS sep =_)
I am trying to obtain column sums & row sums by aggregating with previous row sums & column sums.
For eg.
My initial data frame is:
Flag1 Flag2 Flag3 Type1 Type2 Type3 1 Level1 A FIRST 2 0 0 2 Level1 A SECOND 1 9 0 3 Level1 A THIRD 3 7 0 4 Level1 A FOURTH 9 18 0 5 Level1 A FIFTH 1 22 0 6 Level1 A SIXTH 1 13 0 7 Level1 B FIRST 0 0 0 8 Level1 B SECOND 3 9 0 9 Level1 B THIRD 5 85 0 10 Level1 B FOURTH 4 96 0 11 Level1 B FIFTH 3 40 0 12 Level1 B SIXTH 0 17 0 22 Level2 A FIRST 2 0 0 23 Level2 A SECOND 1 9 0 24 Level2 A THIRD 3 7 0 25 Level2 A FOURTH 9 18 0 26 Level2 A FIFTH 1 22 0 27 Level2 A SIXTH 1 13 0 28 Level2 B FIRST 0 0 0 29 Level2 B SECOND 3 9 0 30 Level2 B THIRD 5 85 0 31 Level2 B FOURTH 4 96 0 32 Level2 B FIFTH 3 40 0 33 Level2 B SIXTH 0 17 0 34 Level3 A FIRST 2 0 0 35 Level3 A SECOND 1 9 0 36 Level3 A THIRD 3 7 0 37 Level3 A FOURTH 9 18 0 38 Level3 A FIFTH 1 22 0 39 Level3 A SIXTH 1 13 0 40 Level3 B FIRST 0 0 0 41 Level3 B SECOND 3 9 0 42 Level3 B THIRD 5 85 0 43 Level3 B FOURTH 4 96 0 44 Level3 B FIFTH 3 40 0 45 Level3 B SIXTH 0 17 0
My desired result is:
Flag1 Flag2 Flag3 Type1 Type2 Type3 Sum 1 Level1 A FIRST 2 0 0 2 2 Level1 A SECOND 1 9 0 12 3 Level1 A THIRD 3 7 0 22 4 Level1 A FOURTH 9 18 0 49 5 Level1 A FIFTH 1 22 0 72 6 Level1 A SIXTH 1 13 0 86 7 Level1 B FIRST 0 0 0 0 8 Level1 B SECOND 3 9 0 12 9 Level1 B THIRD 5 85 0 102 10 Level1 B FOURTH 4 96 0 202 11 Level1 B FIFTH 3 40 0 245 12 Level1 B SIXTH 0 17 0 262 13 Level1 (all) FIRST 2 0 0 2 14 Level1 (all) SECOND 4 18 0 24 15 Level1 (all) THIRD 8 92 0 124 16 Level1 (all) FOURTH 13 114 0 251 17 Level1 (all) FIFTH 4 62 0 317 18 Level1 (all) SIXTH 1 30 0 348 19 Level1 A (all) 17 68 0 85 20 Level1 B (all) 15 247 0 262 21 Level1 (all) (all) 32 315 0 347 22 Level2 A FIRST 2 0 0 2 23 Level2 A SECOND 1 9 0 12 24 Level2 A THIRD 3 7 0 22 25 Level2 A FOURTH 9 18 0 49 26 Level2 A FIFTH 1 22 0 72 27 Level2 A SIXTH 1 13 0 86 28 Level2 B FIRST 0 0 0 0 29 Level2 B SECOND 3 9 0 12 30 Level2 B THIRD 5 85 0 102 31 Level2 B FOURTH 4 96 0 202 32 Level2 B FIFTH 3 40 0 245 33 Level2 B SIXTH 0 17 0 262 34 Level2 (all) FIRST 2 0 0 2 35 Level2 (all) SECOND 4 18 0 24 36 Level2 (all) THIRD 8 92 0 124 37 Level2 (all) FOURTH 13 114 0 251 38 Level2 (all) FIFTH 4 62 0 317 39 Level2 (all) SIXTH 1 30 0 348 40 Level2 A (all) 17 68 0 85 41 Level2 B (all) 15 247 0 262 42 Level2 (all) (all) 32 315 0 347 43 Level3 A FIRST 2 0 0 2 44 Level3 A SECOND 1 9 0 12 45 Level3 A THIRD 3 7 0 22 46 Level3 A FOURTH 9 18 0 49 47 Level3 A FIFTH 1 22 0 72 48 Level3 A SIXTH 1 13 0 86 49 Level3 B FIRST 0 0 0 0 50 Level3 B SECOND 3 9 0 12 51 Level3 B THIRD 5 85 0 102 52 Level3 B FOURTH 4 96 0 202 53 Level3 B FIFTH 3 40 0 245 54 Level3 B SIXTH 0 17 0 262 55 Level3 (all) FIRST 2 0 0 2 56 Level3 (all) SECOND 4 18 0 24 57 Level3 (all) THIRD 8 92 0 124 58 Level3 (all) FOURTH 13 114 0 251 59 Level3 (all) FIFTH 4 62 0 317 60 Level3 (all) SIXTH 1 30 0 348 61 Level3 A (all) 17 68 0 85 62 Level3 B (all) 15 247 0 262 63 Level3 (all) (all) 32 315 0 347 64 (all) A FIRST 6 0 0 6 65 (all) A SECOND 9 27 0 42 66 (all) A THIRD 18 48 0 108 67 (all) A FOURTH 45 102 0 255 68 (all) A FIFTH 48 168 0 471 69 (all) A SIXTH 51 207 0 729 70 (all) B FIRST 0 0 0 0 71 (all) B SECOND 9 27 0 36 72 (all) B THIRD 24 282 0 342 73 (all) B FOURTH 36 570 0 948 74 (all) B FIFTH 45 690 0 1683 75 (all) B SIXTH 45 741 0 2469 76 (all) A (all) 51 552 0 1611 77 (all) B (all) 45 2310 0 5478 78 (all) (all) (all) 96 2862 0 7089
Thanks
解决方案It's not clear what you want here, since you mention "aggregating" and "previous" enitities, but if you want the rowsums followed by the colsums for a dataframe named dfrm, then this works:
dfrm$totals <- rowSums(dfrm[, 4:6]) dfrmT <- rbind(dfrm, data.frame(Flag1="all", Flag2="all", Flag3="all", t( colSums(dfrm[, 4:7]) ) ) ) dfrmT
EDIT: So you did want the row sums and then within levels of Flag1 and Flag2 you wanted cumsums: (And if you want the multiple subtotals, that was answered in your earlier question.) R: calculating margins or row & col sums for a data frame
dfrmT$CS <- ave( dfrmT$totals, list(dfrmT$Flag1, dfrmT$Flag2), FUN=cumsum) dfrmT Flag1 Flag2 Flag3 Type1 Type2 Type3 totals CS 1 Level1 A FIRST 2 0 0 2 2 2 Level1 A SECOND 1 9 0 10 12 3 Level1 A THIRD 3 7 0 10 22 4 Level1 A FOURTH 9 18 0 27 49 5 Level1 A FIFTH 1 22 0 23 72 6 Level1 A SIXTH 1 13 0 14 86 7 Level1 B FIRST 0 0 0 0 0 8 Level1 B SECOND 3 9 0 12 12 9 Level1 B THIRD 5 85 0 90 102 10 Level1 B FOURTH 4 96 0 100 202 11 Level1 B FIFTH 3 40 0 43 245 12 Level1 B SIXTH 0 17 0 17 262 22 Level2 A FIRST 2 0 0 2 2 23 Level2 A SECOND 1 9 0 10 12 24 Level2 A THIRD 3 7 0 10 22 25 Level2 A FOURTH 9 18 0 27 49 26 Level2 A FIFTH 1 22 0 23 72 27 Level2 A SIXTH 1 13 0 14 86 28 Level2 B FIRST 0 0 0 0 0 29 Level2 B SECOND 3 9 0 12 12 30 Level2 B THIRD 5 85 0 90 102 31 Level2 B FOURTH 4 96 0 100 202 32 Level2 B FIFTH 3 40 0 43 245 33 Level2 B SIXTH 0 17 0 17 262 34 Level3 A FIRST 2 0 0 2 2 35 Level3 A SECOND 1 9 0 10 12 36 Level3 A THIRD 3 7 0 10 22 37 Level3 A FOURTH 9 18 0 27 49 38 Level3 A FIFTH 1 22 0 23 72 39 Level3 A SIXTH 1 13 0 14 86 40 Level3 B FIRST 0 0 0 0 0 41 Level3 B SECOND 3 9 0 12 12 42 Level3 B THIRD 5 85 0 90 102 341 all all all 89 795 0 884 884
If on the other hand you want cumsums within each Type with initialization at new Flag1 and Flag2 divisions then:
ave( dfrm[ , grep("Type", names(dfrm))], list(dfrm$Flag1, dfrm$Flag2), FUN=cumsum) Type1 Type2 Type3 1 2 0 0 2 3 9 0 3 6 16 0 4 15 34 0 5 16 56 0 6 17 69 0 7 0 0 0 8 3 9 0 9 8 94 0 10 12 190 0 11 15 230 0 12 15 247 0 22 2 0 0 23 3 9 0 24 6 16 0 25 15 34 0 26 16 56 0 27 17 69 0 28 0 0 0 29 3 9 0 30 8 94 0 31 12 190 0 32 15 230 0 33 15 247 0 34 2 0 0 35 3 9 0 36 6 16 0 37 15 34 0 38 16 56 0 39 17 69 0 40 0 0 0 41 3 9 0 42 8 94 0
That is suitable for cbind()-ing to dfrm but needs work on the names():
dfrmCS <- cbind(dfrm, ave( dfrm[ , grep("Type", names(dfrm))], list(dfrm$Flag1, dfrm$Flag2), FUN=cumsum) ) names(dfrmCS)[8:10] <- paste(names(dfrmCS)[8:10], "CS", sep="_")
这篇关于R:计算列和&行作为来自数据帧的聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!