使用_n_命名变量,每个迭代的datastep

时间:2015-05-04 12:45:00

标签: sas

我需要为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中,或者至少让代码花费更少的时间。

关于如何实现所要求的结果的任何想法?

感谢。

2 个答案:

答案 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;