我有一个非常大的SAS数据集,其中包含我希望根据多个字段对前3个记录求和的记录。
数据的一个例子:
假设数据正确排序,即按Ref,Date1(desc),Time(desc),Date2(Desc)排序。 ' Sum'字段不存在于数据集中(见下文)。
使用SAS,我需要为Date2的每个实例总结每个ref的前三个最近值(基于Date1和时间)。在示例数据中,' Sum'字段是数据需要求和的方式,即将所有1组合在一起,将2组合在一起等等。
对于糟糕的解释道歉,我已经试图这样做几天无济于事!
非常感谢。
答案 0 :(得分:0)
这应该可以解决问题。您需要使用通过by
语句启用的分组处理。然后,您可以使用first.
和last.
表示法来了解您何时到达每个组的开头或结尾。 retain
语句通知sas哪些变量应记住其观察值。
示例数据:
data tmp;
informat date1 date2 ddmmyy10.;
input ref
date1
date2
time
value
;
datalines;
11 03/01/2014 01/01/2014 9 345
11 03/01/2014 01/01/2014 8 322
11 03/01/2014 01/01/2014 7 6546
11 01/01/2014 31/12/2013 6 34
11 01/01/2014 31/12/2013 5 33
22 02/01/2014 01/01/2014 4 234
22 02/01/2014 01/01/2014 3 66
22 01/01/2014 01/01/2014 2 234
33 01/01/2014 01/01/2014 1 2
33 01/01/2014 31/12/2014 0 45
;
run;
然后确保数据正确排序,以便我们可以使用分组处理:
proc sort data=tmp;
by ref date1 date2 descending time;
run;
因为sum()
语句仅在计数器< = 3时累计求和值,所以您将获得每个组的前3个值的总和。当到达组的末尾时,将输出记录。
data tmp2;
set tmp;
by ref date1 date2;
retain counter total .;
if first.date2 then do;
total = 0;
counter = 1;
end;
if counter le 3 then do;
total = sum(total,value);
end;
if last.ref or last.date1 or last.date2 then do;
output;
end;
counter = counter+1;
run;