SAS Programming

DATA Step, Macro, Functions and more
BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Davanden
Obsidian | Level 7

I have two variables, X and Y, plus another variable S. X and Y are integers in the range 1-7. S is a character variable that takes the value '1' and some others. I want to create a series of flags, A1-A4, according to these rules.

 

  • IF S='1', set the flag corresponding to the larger of X and Y, subject to the maximum of 4. For example, if X=1 and Y=2, then set A2 = 1, leaving the other flags equal to zero. If X=2 and Y=6, set A4=1, etc.
  • IF S is anything else, set the flag corresponding to Y, with the same maximum (ignore X entirely).

I first wrote this:

 

DATA Test;
	SET Source;
	ARRAY A[4] A1-A4 (0 0 0 0);
	IF S = '1' THEN
		A[MIN(4,MAX(X,Y))] = 1;
	ELSE
		A[MIN(4,Y)] = 1;
RUN;

 

As I read that, it should change only one of the A1-A4 flags for each record. But what I find is that ALL of the values of A1-A4 get set to 1.

 

If I do this,

 

DATA Test;
	SET Source;
	A1 = 0;
	A2 = 0;
	A3 = 0;
	A4 = 0;
	ARRAY A[4] A1-A4;
	IF S = '1' THEN
		A[MIN(4,MAX(X,Y))] = 1;
	ELSE
		A[MIN(4,Y)] = 1;
RUN;

 

I get what I want. What is the difference?

1 ACCEPTED SOLUTION

Accepted Solutions
data_null__
Jade | Level 19

The inital values for the array implies RETAIN of those variables.

View solution in original post

6 REPLIES 6
data_null__
Jade | Level 19

The inital values for the array implies RETAIN of those variables.

Davanden
Obsidian | Level 7

Thanks to all who replied.  I seldom use the ability to intialize arrays, and I see that there were implications of doing that which I didn't realize.

 

Thanks also to those who showed me how to make the code more compact.  Those are clever uses of SAS functions.  I'm not sure if I will use them.  I fear that a few years from now, someone (possibly me) will look at the code and say, "What the heck does that do?"  I don't want my code to be more clever than my ability to understand it!

 

--Dav

ChrisNZ
Tourmaline | Level 20

ARRAY A[4] A1-A4 (0 0 0 0);

 

initialises the values only once: when the array is created.

 

There are 2 cases when array values are not reset in the data step loop: when they are temporary, and when their values are initialised.

RW9
Diamond | Level 26 RW9
Diamond | Level 26

If it helps, you can shrink your if clauses:

data source;
  s="1"; x=3; y=3; output;
  s="2"; x=1; y=6; output;
run;
data test;
  set source; 
  array a[4] (0 0 0 0);
  a[min(4,max(x,y))]=ifn(s='1',1,0);
run;
ChrisNZ
Tourmaline | Level 20
FreelanceReinh
Jade | Level 19

Side note: The specifiction of an initial value for one array variable implies RETAIN for all variables of the array, including those which are not initialized.

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1860 views
  • 4 likes
  • 5 in conversation