R:计算列和&行作为来自数据帧的聚合 [英] R: calculating column sums & row sums as an aggregation from a dataframe

查看:141
本文介绍了R:计算列和&行作为来自数据帧的聚合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在试图获得列和通过与上一行和&列总和。





我的初始数据框是:

  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])
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:计算列和&amp;行作为来自数据帧的聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆