SAS:在数据步骤中使用宏变量作为数字

SAS: Utilizing macro variables as numbers in data step

我正在修改我编写的一些 SAS 代码,发现了一大块我希望更有效地执行的代码。我有一个名为 'Forecasts' 的时间序列数据集,它仅包含日期和给定日期的 'Forecast' 变量。

我写了一个简单的代码块来获取这个变量,基本上把它分成一系列变量,每个变量代表一个日期:

data forecasts;
set forecasts;
  obs=_n_; 
  array r(241);
  do i=1 to dim(r);
    if obs=i then r(i)=Forecast;
  end; drop i; drop obs; drop forecast;
run;

然而,这段代码的 'r(241)' 部分真的让我很烦。我已经有了一个宏变量,它对应于我需要执行此操作的次数(称为 'n'),我宁愿直接将它插入数组声明中,例如:

array r(&n)

然而,宏变量显然被认为是文本,所以即使我设法将宏变量导入数据步骤,变体 r(&n) 也不起作用,因为它不会将 'n' 读取为数字。除了将整个数据步骤包装到更广泛的宏之外,我如何将 'n' 拉入数据步骤然后将其转换为数字以便此操作有效?

声明:

array r(&n) ;

应该没问题,假设宏变量已定义且具有整数值。请说明您是如何尝试使用它的(以及任何失败的日志消息)。你不需要 'import macro variables into the data step'。宏变量是文本,因为它们的主要工作是解析为 SAS 代码。

18   %let n=3;
19   data _null_;
20     array r{&n};
21     do i=1 to dim(r);
22       put i=;
23     end;
24   run;

i=1
i=2
i=3

作为建议,您可以不这样做。 PROC TRANSPOSE 就是为了这个目的而存在的。那么你甚至不必知道有多少variables/rows。

data forecast;
  call streaminit(7);
  do id = 1 to 243;
    forecast = rand('Normal')*5;
    output;
  end;
run;

proc transpose data=forecast out=forecasts prefix=r;
  by id;
  id id;
  var forecast;
run;

如果您实际上不需要 243 行而只需要一个,请转储 byid 语句。

即使您想在数据步骤中执行此操作,也可以更快地执行此操作(现在您正在检查 241 * 241 次,您只需要 241 次...)通过将 set 在循环里面。这里我使用自动丢弃的变量_n_来迭代循环

data forecasts;
  do _n_ = 1 by 1 until (eof);
    set forecast end=eof;
    array r(243);
    r[_n_] = forecast;
    output; *if you actually want one row per original row still;
    call missing(r[_n_]); *clear it out;
  end;
  drop forecast;
run;