我正在修改我编写的一些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'进入数据步骤然后将其转换为数字,以便此操作有效吗?
答案 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行但只想要一行,请转储by
和id
语句。
即使您想在数据步骤中执行此操作,您也可以更快地完成此操作(现在您需要检查241 * 241次,您只需要241次......)循环内部{1}}。在这里,我使用自动删除的变量set
来迭代循环。
_n_