BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
abhi309
Obsidian | Level 7

Hello All,

 

First of all I want to thank this community which has been very helpful. 

 

I am getting inconsistent result with a array program I am using. I am trying to sum different variables at the same time using array but I am getting incorrect results. Please help me pointing out the issue with the program.

 

data want;

     set have;

     by ID;

     array class (*) CLASS_1-CLASS_30;

     array add (*) SUM_CLASS_1-SUM_CLASS_30;

     do i=1 to dim(class);  

           if first.ID then add(i) =0;

           add(i) + class(i);

           if last.ID;

     end;

     keep ID SUM_CLASS_1-SUM_CLASS_30;

run;

 

Note: CLASS_1-CLASS_30 variables has numeric value.

 

Thank you

 

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

There are two clear logic errors.

 

First you did not RETAIN the variables defined in the ADD array.  So on each new iteration of the data step they will be set to missing.

 

Second you are stopping the data step in the middle of the DO loop.  So only on the last observation in the ID group will any variable other than the first variable in the array have had a chance to have been incremented.

 

Try this instead:

data want;
     set have;
     by ID;
     array class CLASS_1-CLASS_30;
     array add SUM_CLASS_1-SUM_CLASS_30;
     retain SUM_CLASS_1-SUM_CLASS_30;
     if first.id then call missing(of add[*]);
     do i=1 to dim(class);  
           add[i] + class[i];
     end;
     if last.ID;
     keep ID SUM_CLASS_1-SUM_CLASS_30;
run;

 

View solution in original post

3 REPLIES 3
Tom
Super User Tom
Super User

There are two clear logic errors.

 

First you did not RETAIN the variables defined in the ADD array.  So on each new iteration of the data step they will be set to missing.

 

Second you are stopping the data step in the middle of the DO loop.  So only on the last observation in the ID group will any variable other than the first variable in the array have had a chance to have been incremented.

 

Try this instead:

data want;
     set have;
     by ID;
     array class CLASS_1-CLASS_30;
     array add SUM_CLASS_1-SUM_CLASS_30;
     retain SUM_CLASS_1-SUM_CLASS_30;
     if first.id then call missing(of add[*]);
     do i=1 to dim(class);  
           add[i] + class[i];
     end;
     if last.ID;
     keep ID SUM_CLASS_1-SUM_CLASS_30;
run;

 

FreelanceReinh
Jade | Level 19

Hello @abhi309,

 

Unless this is an exercise in DATA step programming, I would prefer PROC SUMMARY for this task:

proc summary data=have;
by id;
var class_1-class_30;
output out=want(drop=_:) sum=sum_class_1-sum_class_30;
run;

 

PS: The RETAIN in the DATA step is redundant thanks to the Sum statement. (Interestingly, even using the Sum statement with only one array reference, say add[17], would imply a RETAIN for all 30 elements of array add.)

ballardw
Super User

A description of what that code is supposed to accomplish would be helpful. Examples of input data and expected/desired output  would help as well.

 

When given code that gets "inconsistent result" without knowing the input or expected output we have to make many guesses as to what is going on and are quite likely to miss something.

 

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 414 views
  • 6 likes
  • 4 in conversation