data b;
set a;
num_001=0;
num_002=0;
num_003=0;
num_004=0;
select(id);
when('001') num_001=num;
when('002') num_002=num;
when('003') num_003=num;
when('004') num_004=num;
end;
output;
do i=1 to 6;
date+1;
if weekday(date) not in (6,7) then output;
end;
keep date num_:;
run;
proc sort data=b;
by date;
run;
data b;
retain date _001 _002 _003 _004;
call missing(_001,_002,_003,_004);
do _n_=1 by 1 until(last.date);
set b;
by date;
_001+num_001;
_002+num_002;
_003+num_003;
_004+num_004;
end;
keep date _001 _002 _003 _004;
run;[/code:1jqiuzjx]作者: shiyiming 时间: 2009-8-24 21:39 标题: Re: 求助:根据一个表的信息产生新表(规则比较复杂) 谢谢hopewell:D <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 刚刚都改了一下:1.应该是09年,2、3都是你说的那样,我开始的结果有点问题~
不过有个问题是,如果我的ID取值很多(比如有10000个),你这个程序能稍微改改变得简单点么?如果更复杂一点,如果每个数据连续出现的不是5次,而是100次,在时间足够长的情况下,产生的b表就会很长了~作者: shiyiming 时间: 2009-8-25 01:18 标题: 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;