我有一个很大的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;
但它不起作用。有关如何将第一个数组的长度带到第二个数组的任何想法吗?
答案 0 :(得分:2)
您需要计算并存储上一步中的数字变量数。最简单的方法是使用dictionary.columns
中提供的proc sql
元数据表。这包含给定数据集的所有列详细信息,包括类型(num或char),因此您只需要计算类型为'num'的列数。
下面的代码就是这样,并将结果存储在宏变量& N中。使用into :
功能。我还使用函数left
和put
从宏变量中删除前导空格,否则在放置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
,所以它现在完全成功了。