2017-03-29 120 views
0

我正在触摸一些我编写的SAS代码,发现我希望更有效地执行一段代码。我有一个名为“预测”的时间序列数据集,它只包含日期和给定日期的“预测”变量。SAS:在数据步骤中使用宏变量作为数字

我写一个简单的代码块借此变量和基本上砍它成一系列的变量,每一个代表一个日期:

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'拉入数据步骤,然后将其转换为数字,以便此操作正常工作?

回答

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 
+0

奇怪的是,我想我什么都试过了,除了刚刚&N,采用各种过于复杂的呼叫等的使用&N做的工作就好了,对不起,浪费你的时间在那里。 –

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语句。

即使您想在数据步骤中完成此操作,您可以通过将set放入里面(现在您正在检查241 * 241次,您只需要241次...)循环。在这里,我使用自动丢弃的变量_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; 
+0

note我在我的例子中使用了243,而不是241,所以请将它调整到正确的值。 – Joe

+0

非常酷,我的数据集实际上比241个变量大得多,所以我会弄清楚并实施它以节省时间。 –

+0

我还会注意到,根据你在做什么,可能有更好的方法来做到这一点 - 例如,如果你正在创建一个对角矩阵,PROC IML是做这件事的地方,一些更高级的回归/等等。类型分析例程也可以为你做到这一点。 – Joe

相关问题