Jacob Ian
Jacob Ian

Reputation: 699

Delete N highest from a dataset in sas

I have a bunch of sas datasets of various lengths and I need to trim the nth highest and lowest values by a variable value.

To do this for when I needed to trim the highest and lowest I did this

    DATA VDBP273_first_night_Systolic; 
     SET VDBP273_first_night  end=eof; 
       IF _N_ =1 then delete;  
        if eof then delete; 
     run;

And it worked fine.

Now I need to do something more like this

 PROC SORT DATA=foo OUT=foo_sorted; 
      BY bar;
          run;


    DATA foo_out; 
     SET foo_sorted end=eof; 
       IF _N_ <= 5  then delete;  
        if eof *OR THE 4 right before it* then delete; 
     run;

I'm sure this is easy but it's stumping me. How can I say the last 5 of this sorted data set delete those?

Upvotes: 0

Views: 117

Answers (3)

stat
stat

Reputation: 669

or simply do the same step done before, adding descending to the proc sort variable

proc sort data=have out=want; by var1 descending; run;

Upvotes: 0

Longfish
Longfish

Reputation: 7602

You can use the nobs= dataset option to store the total number of observations, which then means you can do something similar to your code to exclude the top/bottom n records. I'd recommend putting the number of records to be excluded in a macro variable, it makes it easier to read and change than hard coding it.

%let excl = 6;

data want;
  set sashelp.class nobs=numobs;
  if &excl.< _n_ <=(numobs-&excl.);
run;

Upvotes: 0

sushil
sushil

Reputation: 1576

Since you are presorting your data and then trying to eliminate top n and bottom n record, You can easily solve your problem using OBS= and FIRSTOBS= dataset option.

proc sql noprint;
  select count(*) -4 into:counter from sashelp.class ;
quit;
proc sort data=sashelp.class out=have;by height;run;
proc print data=have;run;
data want;
  set have(firstobs=6 obs=&counter);
run;
proc print data=want;run;

Upvotes: 3

Related Questions