我目前正在尝试编写一些遍历我的数据集的代码,并对每次出现的每个组进行求和,而与整个组无关。这就是当前的样子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,但这将汇总总的组数
答案 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;