/* modified polingjw^s test data */
data test;
array var{32} var01-var32;
do x=1 to 1e6;
do i=-15 to 16;
var{i+16} = i*ranuni(0);
end;
output;
end;
drop i x;
run;
/* polingjw */
proc transpose data=test out=test_transpose name=var;
run;
data polingjw;
set test_transpose;
array col{*} col:;
array max_{5};
array min_{5};
do i=1 to 5;
max_{i} = max(of col
min_{i} = min(of col
do j=1 to dim(col);
if col{j}=min_{i} then col{j}= .;
if col{j}=max_{i} then col{j}=.;
end;
end;
keep var max_: min_:;
run;
/* re-shape to long for comparisons */
data polingjwLong;
set polingjw;
length var $32 type $6 num value 8;
keep var type num value;
array max_(5) max_1 - max_5;
array min_(5) min_1 - min_5;
do num = 1 to 5;
type = "top";
value = max_(num);
output;
end;
do num = 1 to 5;
type = "bottom";
value = min_(num);
output;
end;
run;
/* chang */
%let maxNumVars = 3000;
%let top = 5;
data chang;
set test end=end;
array top(1:&maxNumVars,-&top:&top) _temporary_;
array cur(*) _numeric_;
do k = 1 to dim(cur);
if missing(cur(k)) then leave;
link doTop;
link doBottom;
end;
if end then link doOutput;
return;
doTop:
do j = 1 to ⊤
if missing(top(k,j)) then do;
top(k,j) = cur(k);
leave;
end;
if (cur(k) < top(k,j)) then continue;
if (cur(k) = top(k,j)) then leave;
do i = &top to j+1 by -1;
top(k, i) = top(k, i-1);
end;
top(k, j) = cur(k);
leave;
end;
return;
doBottom:
do j = 1 to ⊤
if missing(top(k,-j)) then do;
top(k,-j) = cur(k);
leave;
end;
if (cur(k) > top(k,-j)) then continue;
if (cur(k) = top(k,-j)) then leave;
do i = &top to j+1 by -1;
top(k,-i) = top(k,-i+1);
end;
top(k,-j) = cur(k);
leave;
end;
return;
doOutput:
length var $32 type $6;
do k = 1 to dim(cur);
var = vname(cur(k));
type = "top";
do num = 1 to ⊤
value = top(k, num);
output;
end;
type = "bottom";
do num = 1 to ⊤
value = top(k,-num);
output;
end;
end;
keep var type num value;
return;
run;
proc compare base=polingjwLong comp=chang;
run;
/* on log, in part
NOTE: No unequal values were found. All values compared are exactly equal.
*/
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.
Find more tutorials on the SAS Users YouTube channel.