Sas 基于id对组进行求和的函数独立于基于id的组

Sas 基于id对组进行求和的函数独立于基于id的组,sas,sum,Sas,Sum,目前,我正在尝试编写一些代码,每次数据集独立于整个组出现时,都会对每个组进行求和。这就是它目前的样子,而不是我想要的样子。我认为这很简单,但sas 9.3不支持sum over语句/ week ID var2 ... MinUnits group 24jun2019 1 x 5 0 01jul2019 1 x 4 1 08jul2019 1

目前,我正在尝试编写一些代码,每次数据集独立于整个组出现时,都会对每个组进行求和。这就是它目前的样子,而不是我想要的样子。我认为这很简单,但sas 9.3不支持sum over语句/

    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,但这将汇总总组数

您可以在BY语句中使用NOTSORTED关键字,使用GROUP变量按组生成

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循环中,当它不是组的第一个观察值时,将其设置为missing。

这样做不管用吗?它会将总数添加到组的每个记录中,但在其他情况下,您的数据似乎是按ID和组排序的

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

通常情况下,汇总时会减少记录数。因为你有6组,所以你只能输出6个观察结果。有额外的观察是令人困惑的。聪明,谢谢你的帮助。它工作得很好。NOTSORTED关键字似乎在将来对我来说是一个非常有用的工具。再次感谢!这一个最终为每个ID添加了所有分钟,这是我一直遇到的问题。然而,如果你有兴趣看看它是如何解决的,汤姆的建议是有效的。