使用 _n_ 命名变量,一个数据步的每次迭代的列

Naming variable using _n_, a column for each iteration of a datastep

我需要为数据步的每次迭代声明一个变量(对于每个 n),但是当我 运行 代码时,SAS 将只输出最后一个声明一个变量,最大的n.

为每一行声明一个变量似乎很愚蠢,但我需要实现这个结果,我正在处理由 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.);

和许多其他语句,但 none 有效。 结果始终相同,ds 仅包含 var&gr,其中 &gr 是最大值 n.

PDV似乎每次迭代都覆盖新变量,但名称不同。 请将结果包含在单个数据步骤中,或者至少让代码花费更少的时间。

关于如何实现要求的结果有什么想法吗?

谢谢。

宏变量并不像您想象的那样起作用。任何宏变量引用都在编译时解析,因此您的 call symput 在解析所有引用后更改宏变量的值。你得到 &gr 是最大值 n 的结果的原因是因为那是你上次 运行 代码时 &gr 的结果。

如果你知道你可以确定最大值_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;

如果你不喜欢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;