【发布时间】:2015-07-01 08:24:04
【问题描述】:
我有一个很大的 SAS 表,让我们将列描述为字符格式的 A 和 B 列,所有其他列都可以采用数字格式(每个变量都有不同的名称),长度未知,例如:
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;
但它不起作用。关于如何将第一个数组的长度带到第二个数组的任何想法?
【问题讨论】:
-
嗯,如果我理解你的问题是正确的,N 是一个数据步变量,&N 调用一个宏变量,所以你必须使用 call symput('N',N);循环后或更好:调用 symput('varrLen',dim(Varr));并删除循环(不确定 n 是否从全局宏变量中保留)
-
现在我在循环后都尝试了 call symput('N',N);并在循环内调用 symput('varrLen',dim(Varr));对于以下代码,两者都给出了相同的错误:array Summ {*} Summ1-Summ&N;错误是:“编号变量列表 (Summ1-SummN) 上缺少数字后缀。”
-
我猜你必须使用 summ"&N" ,但我不确定你是否可以通过这种方式生成变量名。最好先尝试 Keiths 解决方案