Here an approach which dynamically determines the variables for the array based on a variable naming pattern.
It then also determines the variables in the array where the max value over the whole data set is 99 and then only loops over these variables to set 99 to missing.
data have;
input var1 var2 var3;
datalines;
23 12 133
94 45 99
99 32 54
;
run;
/* dynamically determine variables for array and number of selected variables */
proc sql noprint;
select
name , count(*)
into :var_list separated by ' ', :n_vars
from dictionary.columns
where libname='WORK' and memname='HAVE' and upcase(name) like 'VAR%'
;
quit;
%let n_vars=%left(&n_vars);
%put &=var_list;
%put &=n_vars;
options symbolgen;
/* determine columns where max value is 99 */
%let elem_99=0;
data _null_;
set have end=last;
array in_vars {&n_vars} &var_list;
array max_vals {&n_vars} 8 _temporary_;
do _i=1 to dim(in_vars);
max_vals{_i}=max(max_vals{_i}, in_vars{_i});
end;
if last then
do;
/* determine columns where max val is 99 */
length _elements $ 1000;
do _i=1 to dim(max_vals);
if max_vals{_i}=99 then _elements=catx(',',_elements,_i);
end;
if not missing(_elements) then call symputx('elem_99',_elements);
end;
run;
%put &=elem_99;
data want(drop=_:);
set have;
array in_vars {&n_vars} &var_list;
/* only loop over variables where max val is 99 */
if "&elem_99" ne "0" then
do;
do _i=&elem_99;
if in_vars{_i}=99 then call missing(in_vars{_i});
end;
end;
run;
... View more