我需要为datastep的每次迭代声明一个变量(对于每个 n ),但是当我运行代码时,SAS将只输出声明的最后一个变量,最大的 ñ
似乎很愚蠢地为每一行声明一个变量,但我需要实现这个结果,我正在处理由proc freq创建的数据集,我需要为每个组(数据集的每一行)创建一个列。
结果将在宏中,因此必须完全灵活。
proc freq data=&data noprint ;
table &group / out=frgroup;
run;
data group1;
set group (keep=&group count ) end=eof;
call symput('gr', _n_);
*REQUESTED code will go here;
run;
我试过这些:
var&gr.=.;
call missing(var&gr.);
和很多其他声明,但都没有奏效。 总是相同的结果,ds仅包括var& gr,其中& gr是最大 n 。
似乎PDV每次迭代都会覆盖新变量,但名称不同。 请将结果包含在一个datastep中,或者至少让代码花费更少的时间。
关于如何实现所要求的结果的任何想法?
感谢。
答案 0 :(得分:3)
宏观变量并不像你认为的那样工作。在编译时解析任何宏变量引用,因此在解析所有引用之后,call symput
正在更改宏变量的值。你得到& gr是最大 n 的结果的原因是因为这是你上次运行代码时的结果。
如果您知道可以确定最大_n_
,则可以将最大值放入宏变量并声明一个数组:
查找最高_n_
并将值分配给maxn
:
data _null_;
set have end=eof;
if eof then call symput('maxn',_n_);
run;
创建变量:
data want;
set have;
array var (&maxn);
run;
答案 1 :(得分:3)
如果您不喜欢proc transpose
(如果您需要3列,您可以为每列使用一次,然后将输出放在一起),您可以使用数组完成所需的操作。
首先需要确定输入数据集中的组(即行)数,然后定义一个维度等于该数字的数组。
然后可以使用_n_
作为索引来调用数组的第i个元素。
在以下代码中,&gr.
包含组数:
data group1;
set group;
array arr_counts(&gr.) var1-var&gr.;
arr_counts(_n_)= count;
run;
在SAS中,有几种方法可以确定数据集中的obs数量,我最喜欢的是:(不适用于视图)
data _null_;
if 0 then set group nobs=n;
call symputx('gr',n);
run;