hi all: how may I simplify the code? It works but there might be more efficient way. thanks in advance.
options mprint mlogic;
%macro pd(ord,ds,ovar,fvar,v1,v2,v3,v4);
data &ds (keep=subject &fvar.: ds _lastf);
length ds $10.;
set new.&ds(keep= subject
%if &ord in (-1,-2) %then %do; &v1.: %end;
%else %if &ord=1 %then %do; &v1.: &v2.: %end;
%else %if &ord=2 %then %do; &v1.: &v2.: &v3.: %end;
%else %if &ord=3 %then %do; &v1.: &v2.: &v3.: &v4.:%end;
);
ds="&ds.";
%if &ord=-2 %then %do;
_lasf=&fvar.;
%end;
%if &ord ne -2 %then %do;
if &v1._dd ^=. then &ovar.=put(&v1._yyyy, 4.)||'-'||put(&v1._mm, z2.)||'-'||put(&v1._dd, z2.);
else if &v1._mm ^=. then &ovar.=put(&v1._yyyy, 4.)||'-'||put(&v1._mm, z2.)||'-01';
else if &v1._yyyy^=. then &ovar.=put(&v1._yyyy, 4.)||'-01'||'-01';
&fvar.=input(&ovar.,yymmdd10.); format &fvar. yymmdd10.;
_lastf=&fvar.;
%end;
%else %if &ord>=1 %then %do;
if &v2._dd^=. then &ovar.2=put(&v2._yyyy, 4.)||'-'||put(&v2._mm, z2.)||'-'||put(&v2._dd, z2.);
else if &v2._mm^=. then &ovar.2=put(&v2._yyyy, 4.)||'-'||put(&v2._mm, z2.)||'-01';
else if &v2._yyyy^=. then &ovar.2=put(&v2._yyyy, 4.)||'-01'||'-01';
&fvar.2=input(&ovar.2,yymmdd10.); format &fvar.2 yymmdd10.;
array dt &fvar. &fvar.2;
do over dt;
if dt=. then dt="01JAN1900"d;
end;
_lastf=max(of dt[*]);
%end;
%if &ord>=2 %then %do;
if &v3._dd^=. then &ovar.3=put(&v3._yyyy, 4.)||'-'||put(&v3._mm, z2.)||'-'||put(&v3._dd, z2.);
else if &v3._mm^=. then &ovar.3=put(&v3._yyyy, 4.)||'-'||put(&v3._mm, z2.)||'-01';
else if &v3._yyyy^=. then &ovar.3=put(&v3._yyyy, 4.)||'-01'||'-01';
&fvar.3=input(&ovar.3,yymmdd10.); format &fvar.3 yymmdd10.;
array dt2 &fvar. &fvar.2 &fvar.3;
do over dt2;
if dt2=. then dt2="01JAN1900"d;
end;
_lastf=max(of dt2[*]);
%end;
%if &ord=3 %then %do;
if &v4._dd^=. then &ovar.4=put(&v4._yyyy, 4.)||'-'||put(&v4._mm, z2.)||'-'||put(&v4._dd, z2.);
else if &v4._mm^=. then &ovar.4=put(&v4._yyyy, 4.)||'-'||put(&v4._mm, z2.)||'-01';
else if &v4._yyyy^=. then &ovar.4=put(&v4._yyyy, 4.)||'-01'||'-01';
&fvar.4=input(&ovar.4,yymmdd10.); format &fvar.4 yymmdd10.;
array dt3 &fvar. &fvar.2 &fvar.3 &fvar.4;
do over dt3;
if dt3=. then dt3="01JAN1900"d;
end;
_lastf=max(of dt3[*]);
%end;
format _lastf yymmdd10.;
run;
proc sort;by subject decending _lastf;run;
proc sort data=&ds. out=&ds.f nodupkey;by subject;run;
run;
%if &ord<=-1 %then %do;
proc append base=af Data=&ds.f;
%end;
%else %if &ord=1 %then %do;
proc append base=bf Data=&ds.f;
%end;
%else %if &ord=2 %then %do;
proc append base=cf Data=&ds.f;
%end;
%else %if &ord=3 %then %do;
proc append base=df Data=&ds.f;
%end;
run;
%mend;
/*pd(ord,ds, nvar,ovar,fvar,v1,v2,v3,v4);*/
%pd(3,a, lstdt, last, adat, a2dat,a3dat,a4dat)
%pd(2,b, lstdt, last, b1dat,b2dat,b3dat)
%pd(1,c, lstdt, last, c1dat,c2dat, , )
%pd(-1,d, lstdt, last, ddat , , , )
%pd(-2,e, lstdt, last, edat , , , )
... View more