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 行而只需要一个,请转储 by
和 id
语句。
即使您想在数据步骤中执行此操作,也可以更快地执行此操作(现在您正在检查 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;
我正在修改我编写的一些 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 行而只需要一个,请转储 by
和 id
语句。
即使您想在数据步骤中执行此操作,也可以更快地执行此操作(现在您正在检查 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;