如果有按周期,比如按月,按周对数据进行计数或者累加,可以使用以下宏。SAS默认的周一年就会循环一次,有些长期的数据不太合适。
*ps:在tvar这个宏里自定义周的开始时间。
inset=指定输入数据集
key=日期变量
slot=tweek (周) 或 slot=tmonyy(月)
start=1 默认从第一周开始显示
var=cnt 默认为计数,要求和的话只要把这个选项改成求和变量就可以了,结果如下:
_name_ | tweek1 | tweek2 | tweek3 | tweek4 | tweek5 | tweek6 | tweek7 | tweek8 | tweek9 | tweek10 | tweek11 | tweek12 | tweek13 |
test_c | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
test_c_acc | 1 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | 66 | 78 | 91 |
%global setn;
%let setn=1;
**********主宏*************
/*数据集中不要有cnt为变量名的变量*/
/*获取最终变量名前缀*/
%macro wr(inset,key,slot=tweek,start=1,var=cnt);
data _null_;
a=substr("&inset",find("&inset",'.')+1);
call symput('nm',a);
run;
/*变量后缀*/
data a1;
set &inset;
cnt=1;
svar=&var;
if &var eq cnt then call symput('pfix','c');
else call symput('pfix','s');
run;
%tvar(a1,&key)
proc summary data=a1;
class &slot;
var svar;
output out=a2 sum(svar)=%sysfunc(cats(&nm,_&pfix));
run;
data b1;
set a2;
if _type_=1;
%sysfunc(cats(&nm,_&pfix,_acc))+%sysfunc(cats(&nm,_&pfix));
if &slot ge &start;
keep &slot %sysfunc(cats(&nm,_&pfix,_acc)) %sysfunc(cats(&nm,_&pfix));
run;
data _null_;
call symput('sn',cats('c',"&setn"));
run;
%sort(b1,&slot)
proc transpose data=b1 out=&sn prefix=&slot;
id &slot;
run;
data _null_;
call symput('setn',&setn+1);
run;
%mend;
***********两个被调用的宏***************
%macro tvar(ins,dt);
data &ins;
set &ins;
tweek=floor((&dt-'4jan2016'd)/7)+1;
a=put(&dt,monyy7.);
tmonyy=input(a,monyy7.);
drop a;
format tmonyy monyy7.;
run;
%mend;
%macro sort(in,key);
proc sort data=∈
by &key;
run;
%mend;