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

时间:2017-03-29 14:50:59

标签: macros sas datastep

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

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

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)也不起作用,因为它没有读取&#39 ; N'作为数字。除了将整个数据步骤包含在一个更广泛的宏之外,我怎样才能拉出' n'进入数据步骤然后将其转换为数字,以便此操作有效吗?

2 个答案:

答案 0 :(得分:2)

声明:

array r(&n) ;

应该没问题,假设宏变量已定义且具有整数值。请说明您如何使用它(以及任何失败的日志消息)。您不需要将宏变量导入数据步骤'。宏变量是文本,因为它们的主要工作是解析为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

答案 1 :(得分:2)

作为一个建议,你不需要这样做。为此目的存在PROC TRANSPOSE。那么你甚至不必知道有多少变量/行。

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次......)循环内部{1}}。在这里,我使用自动删除的变量set来迭代循环。

_n_