I am thinking of something like below macro code:
options mprint mlogic;
%macro getArrayData(old,numvars);
data have1;
%do _index=1 %to 3 until(last.id);
set &old;
by id;
/** index i starts at 2 because the first variable is the ID **/
%do i=2 %to 1000;
/** add suffix _var to each variable and make it an array of length 3 **/
array %scan(&var_list,&i.)_var {3}; ;
%end;
%if time1 = time %then %do;
/** Loop through 1000 vriable names stored in macrovariable var_list **/
%do j=2 %to 1000;
/** add suffix _var to current variable and take the first element **/
%scan(&var_list,&j.)_var {1}=%scan(&var_list,&j.);
%end;
%end;
%else %if time2 = time %then %do;
%do k=2 %to 1000;
/** add suffix _var to current variable and take the second element **/
%scan(&var_list,&k.)_var {2}=%scan(&var_list,&k.);
%end;
%end;
%else %if time3 = time %then %do;
%do n=1 %to 1000;
/** add suffix _var to current variable and take the third element **/
%scan(&var_list,&n.)_var {3}=%scan(&var_list,&n.);
%end;
%end;
%mend getArrayData;
One simplification I can make is that in Dataset Old and Have1, time can only ever be 10,11 or 12.
data Old;
input ID time a;
datalines;
999 10 3
999 11 .
999 12 4
99 10 5
99 11 .
99 12 .
; run;
data have1;
input ID a1-a3 time1-time3;
datalines;
99 . . . 1 2 3
99 . . . 10 11 12
999 . . . 1 2 3
999 . . . 10 11 12
;
... View more