基于id独立基于id求和的函数

时间:2019-06-24 16:21:37

标签: sas sum

我目前正在尝试编写一些遍历我的数据集的代码,并对每次出现的每个组进行求和,而与整个组无关。这就是当前的样子vs我想要的。我以为这很简单,但sas 9.3不支持sum over statement /

    week       ID  var2 ... MinUnits group 
    24jun2019  1    x       5        0          
    01jul2019  1    x       4        1          
    08jul2019  1    x       7        1          
    15jul2019  1    x       2        1
    22jul2019  1    x       0        2          
    29jul2019  1    x       5        2 
    05aug2019  1    x       2        2     
    24jun2019  1    x       9        0          
    01jul2019  2    x       5        1          
    08jul2019  2    x       6        1
    15jul2019  2    x       8        1
    22jul2019  2    x       1        2          
    29jul2019  2    x       5        2
    05aug2019  3    x       3        2

我希望它显示什么

 week       ID  var2 ... MinUnits group  SumMinUnits
    24jun2019  1    x       5        0          5
    01jul2019  1    x       4        1          13
    08jul2019  1    x       7        1          
    15jul2019  1    x       2        1
    22jul2019  1    x       0        2          7
    29jul2019  1    x       5        2 
    05aug2019  1    x       2        2     
    24jun2019  1    x       9        0          9
    01jul2019  2    x       5        1          19
    08jul2019  2    x       6        1
    15jul2019  2    x       8        1
    22jul2019  2    x       1        2          9
    29jul2019  2    x       5        2
    05aug2019  2    x       3        2

如您所见,简单地按组求和是不可行的,因为对于不同的ID(最终是相同的ID),组号会重复出现,但在这些情况下,位置变量与ID出现的原始时间不同。

请注意,我并不是要您为我编写代码,因为这工作太多。我只想知道是否有可以使用的functin。我曾考虑过使用循环和groupby,但这将汇总总的组数

2 个答案:

答案 0 :(得分:1)

您可以在BY语句上使用NOTSORTED关键字,并使用GROUP变量来创建BY组。

data want;
do until (last.group);
  set have ;
  by group notsorted;
  SumMinUnits=sum(SumMinUnits,MinUnits);
end;
do until (last.group);
  set have ;
  by group notsorted;
  output;
end;
run;

请注意,这会将组中所有观测值的SUMMINUNITS设置为相同的值。您可以添加额外的代码,以在第二次DO循环不是该组的第一次观察时将其设置为丢失。

答案 1 :(得分:0)

像这样的作品难道不是吗?它将总数添加到组的每条记录中,否则您的数据似乎按ID和GROUP排序。

   proc sql;
   create table want as
   select *, sum(minUnits) as total_units
   from have
   group by ID, GROUP;
   quit;