Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Scalars from group sums

    Hey all,

    I have a dataset with a string variable as a group id and a second variable (example below with first 240 rows).
    I would like to create n opportunely named scalars (where n is the number of groups), with each scalar being the sum of the second variable for a given group. I have many groups, so I guess a loop would be useful but for some reasons I haven't been able to go anywhere with that.

    Thanks a lot for your help.
    Matteo

    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input str25 id_origin_year float treat_a_weighted
    "ABRUZZO2014"  25.56268
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"   23.3318
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"   9.27622
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"   3.42796
    "ABRUZZO2014"   2.49249
    "ABRUZZO2014"         0
    "ABRUZZO2014"    2.7585
    "ABRUZZO2014"    34.543
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"  .6556501
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"   1.73568
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"  .9329401
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"  34.11275
    "ABRUZZO2014"    2.5402
    "ABRUZZO2014"   9.36936
    "ABRUZZO2014"         0
    "ABRUZZO2014"   4.83854
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"     3.476
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"    2.7311
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2014"   2.20696
    "ABRUZZO2014"   1.95192
    "ABRUZZO2014"   7.93092
    "ABRUZZO2014" 125.45865
    "ABRUZZO2014"         0
    "ABRUZZO2014"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   1.42198
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   7.17032
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   9.75351
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   2.37815
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"  50.12847
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015" 4.1416802
    "ABRUZZO2015"         0
    "ABRUZZO2015"  11.57039
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"    .04938
    "ABRUZZO2015"         0
    "ABRUZZO2015"   4.66056
    "ABRUZZO2015"  24.84108
    "ABRUZZO2015"    1.7994
    "ABRUZZO2015"         0
    "ABRUZZO2015"   1.93389
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   3.57275
    "ABRUZZO2015"   1.86237
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"   24.9271
    "ABRUZZO2015"   5.20351
    "ABRUZZO2015"         0
    "ABRUZZO2015" .53159004
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"  .6961901
    "ABRUZZO2015"  132.8732
    "ABRUZZO2015"  11.24676
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"  38.46422
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"         0
    "ABRUZZO2015"    3.0926
    "ABRUZZO2016"   1.47436
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016" 4.4109597
    "ABRUZZO2016"  43.53964
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"    7.0598
    "ABRUZZO2016"  45.46491
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"    .41065
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"    2.6589
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"   5.14008
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"    5.9629
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"    3.7441
    "ABRUZZO2016"   4.41112
    "ABRUZZO2016"  19.02577
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"   3.14525
    "ABRUZZO2016"    1.7682
    "ABRUZZO2016"         0
    "ABRUZZO2016" 143.15472
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"   22.8019
    "ABRUZZO2016"         0
    "ABRUZZO2016"   2.04848
    "ABRUZZO2016"         0
    "ABRUZZO2016"         0
    "ABRUZZO2016"   1.07358
    "ABRUZZO2016"   1.24176
    "ABRUZZO2016"         0
    "ABRUZZO2016"   11.4801
    "ABRUZZO2016"   3.99244
    "ABRUZZO2017"         0
    "ABRUZZO2017"   1.80716
    "ABRUZZO2017"         0
    "ABRUZZO2017"     1.797
    "ABRUZZO2017"    .59517
    "ABRUZZO2017"   3.01545
    "ABRUZZO2017"    5.4393
    "ABRUZZO2017"         0
    "ABRUZZO2017"    6.1981
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017" 33.738903
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"   3.73725
    "ABRUZZO2017"  .8834001
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"  12.37065
    "ABRUZZO2017"  89.65692
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"   5.97768
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"  11.68145
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"   1.70656
    "ABRUZZO2017"  64.36898
    "ABRUZZO2017"   5.60305
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"    4.3704
    "ABRUZZO2017"  30.41626
    "ABRUZZO2017"    3.3262
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017" 18.543049
    "ABRUZZO2017"   187.424
    "ABRUZZO2017"   1.09888
    "ABRUZZO2017"   7.31488
    "ABRUZZO2017"         0
    "ABRUZZO2017"         0
    "ABRUZZO2017"    9.6066
    end

  • #2
    You probably want this:
    Code:
    . levelsof id_origin_year, local(levels)
    `"ABRUZZO2014"' `"ABRUZZO2015"' `"ABRUZZO2016"' `"ABRUZZO2017"'
    
    . foreach l of local levels {
      2. summ treat_a_weighted if id_origin_year=="`l'" , meanonly
      3. scalar SumBy`l' = r(sum)
      4. }
    
    . scalar list
    SumByABRUZZO2017 =  510.67729
    SumByABRUZZO2016 =  334.00962
    SumByABRUZZO2015 =   342.3191
    SumByABRUZZO2014 =  299.33332

    Comment


    • #3
      I would still recommend creating a variable using egen with the group sums. Backing up, why would many scalars be more useful to you than a single variable containing them all?

      Put it this way: If you have many scalars, you are committing yourself to a loop every time you want to use them one by one.

      If you have the totals in a variable, much of the time you can avoid a loop, and if a loop is necessary you can still loop over the groups.

      Some experience with programming in other software can lead people to think in terms of writing loops when Stata often allows you to avoid such looping, e.g. by using by:. or by() or even more directly. For example, wanting to scale values to proportions or percents of a group total is just


      Code:
      egen total = total(x), by(group)
      
      gen pc = 100 * x/total
      In fact,

      Code:
      egen pc = pc(x), by(group)
      will do this!
      Last edited by Nick Cox; 01 Feb 2023, 03:34.

      Comment


      • #4
        But I do not know why would you want those as scalars. It is easier to put them in a variable like this:
        Code:
        . egen sumbyid = total( treat_a_weighted), by( id_origin_year )

        Comment


        • #5
          Joro, Nick, many thanks to both of you. You are totally right, I can very well live with a variable.

          Comment

          Working...
          X