|
|
地板

楼主 |
发表于 2009-8-25 01:18:06
|
只看该作者
Re: 求助:根据一个表的信息产生新表(规则比较复杂)
解决了多ID和连续大于5次的问题,没有数据测试,不知道效率怎么样
[code:1mvsc132]
/* NOTE: 原始数据的日期连续且不包含周末 */
data a;
input Date yymmdd8. ID $ Num;
format Date yymmdd10.;
cards;
08-07-08 001 100
08-07-08 002 50
08-07-09 001 30
08-07-10 004 10
08-07-13 003 60
08-07-14 002 50
08-07-15 004 30
;
%macro repeat_lag(in_ds,out_ds,lag);
options nosymbolgen nomprint;
%local id_num id_list_num id_list_sum;
/* 获取变量列表 */
%macro get_id_list;
proc contents data=&out_ds out=_temp(keep=name varnum) noprint nodetails;
run;
proc sort data=_temp;
by varnum;
run;
data _null_;
set _temp(firstobs=2) end=eof;
length id_list $256;
retain id_list;
id_list=catx(' ',id_list,name);
if eof then do;
call symput('id_num',put(_n_,best8.));
call symput('id_list_num',id_list);
call symput('id_list_sum',translate(id_list,'sum','num'));
end;
run;
%mend;
/* 转置原始数据 */
proc transpose data=&in_ds out=&out_ds(drop=_name_) prefix=num_;
by date;
id id;
var num;
run;
%get_id_list
/* 在结束日对冲数据 */
data &out_ds(drop=i);
set &out_ds;
output;
date=intnx('weekday',date,&lag,'sameday');
array arr{*} num_:;
do i=1 to dim(arr);
if arr(i) ne . then arr(i)=-arr(i);
end;
output;
run;
/* 整理数据 */
proc sort data=&out_ds;
by date;
run;
data &out_ds(keep=date sum_:);
do _n_=1 by 1 until(last.date);
set &out_ds;
by date;
array arr_num{*} &id_list_num;
array arr_sum{*} &id_list_sum (&id_num*0);
do i=1 to &id_num;
arr_sum(i)=sum(arr_sum(i),arr_num(i));
end;
end;
run;
proc datasets library=work nolist;
delete _temp;
run;
quit;
%mend;
%repeat_lag(a,b,5)[/code:1mvsc132] |
|