Help using Base SAS procedures

setting a range of numbers

Reply
Contributor
Posts: 20

setting a range of numbers

I know there has to be a super simple way to do this.

I need to create an indicator variable for a large range of contentious and non continuous numbers.  In my past I've only had a max of 20 numbers so I just wrote each one in.  Lets say for example my numbers are 142-244, 333, and 401-420.  How would I do this?  I ultimately want to create an indicator variable to say if the previous numbers are there put 1 and if any other number put 0. I've been trying to figure this out for a day and by now i could have typed out the numbers....

Side note, they were originally assigned at characters and I changed it to numbers to try to figure this out.

Thank you for your help,

Jen

Super User
Super User
Posts: 7,977

Re: setting a range of numbers

Hi,

You want do loops:

data want;

     do I=142 to 244;

          output;

     end;

     do I=333,334,335;

          output;

     end;

run;

Contributor
Posts: 20

Re: setting a range of numbers

For my number range, I ultimately need to exclude those numbers for certain tables.  Also there is not always numbers in between the numbers I want.  Like 200 and 205 is missing but I need 142-245.

Super User
Super User
Posts: 7,977

Re: setting a range of numbers

Perhaps post some test data of what you have and what you want.  If it is as I think then;

data want;

     do I=142 to 244;

          if thenumber ne I then do;

               /* do your code */

          end;

     end;

run;

Super User
Posts: 5,516

Re: setting a range of numbers

If I have the correct picture, you have a variable that takes on numeric values and you need to examine this variable to determine whether the current observation should be included or excluded.  Does that sound right?

If that's the case, a format is probably the best bet.  You can hard-code a format, such as:

proc format;

  value inex  142-144, 333, 401-420 = 'Include' other='Exclude';

run;

Then in a procedure you can use the format, such as:

where put(some_variable, inex.)='Include';

Formats let you handle trickier ranges, such as excluding 200 and 205 specifically.  And if your list of values is long but is contained in a data set, formats let you use the data set to construct the format instead of having to type out all the values.  Formats can be permanently saved, so they don't have to re-created each time.

So the first question is still, is this the actual problem you are trying to solve?

Contributor
Posts: 45

Re: setting a range of numbers

From the subject and your explanation I just understand that

     You have a list of continuos and non-continuos number from which you want to set some ranges of continuous values.

Final desired output is just starting range and ending range... this is what i understand, correct me if i am wrong.

And here is my code.....

data have;                                                         

Input mynum;                                                       

Datalines ;                                                        

142                                                                

143                                                                

144                                                                

145                                                                

333                                                                

401                                                                

402                                                                

403                                                                

404                                                                

;                                                                  

                                                                   

data want;                                                         

set have;                                                         

init = mynum;                                                     

if _N_ =1 then start = mynum;                                     

if mynum - prevnum ne 1 then start = init;                        

prevnum = mynum;                                                  

retain start init prevnum;                                        

                                                                   

proc sort data=want; by start; run;                                

data want(rename=(start=rangest prevnum=rangelt) drop=mynum init);

set want;                                                        

by start;                                                        

if last.start;                                                   

Output:

Obs    rangest    rangelt

                         

1       142        145  

2       333        333  

3       401        404 

If this is not your desired output, Give us some example data and your desired output!!!!

Super User
Posts: 19,851

Re: setting a range of numbers

Use the colon operator to specify a range of values and then comma's to separate the different ranges and values.

data subset;

    set sashelp.class;

    if age in (12:14, 16);

run;

if number in (142:244, 333, 401:420) then flag=1; else flag=0;

Ask a Question
Discussion stats
  • 6 replies
  • 283 views
  • 3 likes
  • 5 in conversation