user3714330
user3714330

Reputation: 689

Bring the length of an array to another array in SAS?

I have a big SAS table, let's describe the columns as, A nd B columns in character format and all other columns are vairable in numerical format (every variable has a different name) with unknow amounth length N, like:

A     B   Name1    Name2    Name3 ....    NameN
-------------------------------------------------
Char Char Number1  Number2  Number3 ..... NumberN
.................................................
.................................................

The goal is that the numerical array Name1-NameN will sum up downward through the Class=B (By B), So the final table will look like this:

 A     B   Name1 Name2 Name3 ....  NameN
----------------------------------------
Char Char  Sum1  Sum2  Sum3 .....  SumN
........................................
........................................

To do this sum-up, I described 2 arrays. The first one is:

array Varr {*} _numeric_; /* it reads only numerical columns */

Then I described another array with the same length (Summ1-SummN) to do the sum-up process.

The thing is that I can only describe the length of this new array manually. For example, if there are 80 numerical values, then I have to write manually like:

array summ {80} Summ1-Summ80; 

The code works when I write it manually. But instead I want to write something like

array summ {&N} Summ1-Summ&N;  /* &N is the dimension of the array Varr */

I tried with do-loop and dim(Varr) under the array in many different ways like:

data want;
array Varr {*} _numeric_;
do i=1 to dim(Varr);
    N+1 ; 
end;
%put &N; 
array Summ {&N} Summ1-Summ&N;
retain Summ;

if first.B then do i=1 to dim(varr); summ(i)=varr(i) ;end;  
else do i =1 to dim(varr); summ(i) = summ(i) + varr(i) ; varr(i)=summ(i);  end; 

drop Summ1-Summ&N;
run;

But it doesn't work. Any idea about how to bring the length of the first array to the second array?

Upvotes: 1

Views: 562

Answers (2)

Longfish
Longfish

Reputation: 7602

You need to calculate and store the number of numeric variables in a previous step. The easiest way is to use the dictionary.columns metadata table, available in proc sql. This contains all column details for a given dataset, including the type (num or char), you therefore just need to count the number of columns where the type is 'num'.

The code below does just that and stores the result in a macro variable, &N. using the into : functionality. I've also used the functions left and put to remove leading blanks from the macro variable, otherwise you'll encounter problems when putting summ1-summ&N.

I've also added a 2nd solution based on your answer, but will be more efficient as it doesn't read in any records, only the column details

proc sql noprint;
select left(put(count(*),best12.)) into :N
from dictionary.columns
where libname='SASHELP' and memname='CLASS' and type='num';
quit;

%put Numeric variables = &N.;

/*****************************************/
/* alternative solution */

data _null_;
set sashelp.class (obs=0);
array temp{*} _numeric_;
call symputx('N',dim(temp));
run;

%put Numeric variables = &N.;

Upvotes: 2

user3714330
user3714330

Reputation: 689

Now I found another solution with a little modification of the solution from @kl78

Before when I tried with call symput ('N',dim(varr)); I forgot to change the numeric format and to remove the uneccessary spaces. When I run it without format, the code tried to find Summ_____87, so it gave error.

Now I run it with format, call symput ('N',put(dim(varr),2.)); the code can find Summ87, so it is totally sucessfull now.

Upvotes: 1

Related Questions