将数组的长度带到SAS中的另一个数组?

时间:2015-07-01 08:24:05

标签: arrays sas

我有一个很大的SAS表,让我们将列描述为字符格式的A和B列,所有其他列都可以以数字格式(每个变量具有不同的名称)可变,具有未知的金额长度N,如:

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

目标是数值数组Name1-NameN将通过Class = B(By B)向下求和, 所以决赛桌看起来像这样:

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

为了做到这一点,我描述了2个数组。第一个是:

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

然后我描述了另一个具有相同长度(Summ1-SummN)的数组来进行总结过程。

问题是我只能手动描述这个新数组的长度。例如,如果有80个数值,那么我必须手动编写:

array summ {80} Summ1-Summ80; 

我手动编写时代码有效。但我想写一些类似

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

我尝试使用do-loop和dim(Varr)在数组下以许多不同的方式,如:

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;

但它不起作用。有关如何将第一个数组的长度带到第二个数组的任何想法吗?

2 个答案:

答案 0 :(得分:2)

您需要计算并存储上一步中的数字变量数。最简单的方法是使用dictionary.columns中提供的proc sql元数据表。这包含给定数据集的所有列详细信息,包括类型(num或char),因此您只需要计算类型为'num'的列数。

下面的代码就是这样,并将结果存储在宏变量& N中。使用into :功能。我还使用函数leftput从宏变量中删除前导空格,否则在放置summ1-summ&N.

时会遇到问题

我还根据你的答案添加了第二个解决方案,但由于它没有读入任何记录,只有列详细信息

,因此效率更高
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.;

答案 1 :(得分:1)

现在我找到了另一个解决方案,对@ kl78

的解决方案进行了一些修改

在我尝试使用call symput ('N',dim(varr));之前,我忘记更改数字格式并删除不必要的空格。当我在没有格式的情况下运行它时,代码试图找到Summ_____87,因此它给出了错误。

现在我使用格式运行它,call symput ('N',put(dim(varr),2.));代码可以找到Summ87,所以它现在完全成功了。