SAS do-Loops和set语句

时间:2018-03-02 21:42:50

标签: sas do-loops

为什么这个宏工作? (确实如此)循环能够启动,尽管nrows变量是在循环内的set语句中定义的。 SAS在开始循环之前是否读取了set语句?我在哪里可以找到关于这个问题的文档(循环中的哪些语句,如果有的话,在循环开始之前执行)?

%macro get_last_n_rows(n, existing, new);
data &new.;
do _i_ = 1 + nrows - &n. to nrows;
  set &existing. point = _i_ nobs = nrows;
  output;
end;
stop;  
run;
%mend get_last_n_rows;

1 个答案:

答案 0 :(得分:2)

您的问题的简短答案是:是的,SAS读取循环执行前可用的行数。实际上,SAS在数据步骤执行之前读取可用的行数;它是在数据步骤编译时确定的。例如,请参阅this paperthis paper以及其他许多内容。

具体参见SAS documentation for SET

  

在编译时,SAS读取每个数据集的描述符部分并自动分配NOBS =变量的值。因此,您可以在SET语句之前引用NOBS =变量。该变量在DATA步骤中可用,但不会添加到任何输出数据集。

注意这与do循环无关;对于整个数据步骤(当然这本身就是一个大循环)也是如此。