【问题标题】:SAS do-Loops and set statementsSAS do-Loops 和 set 语句
【发布时间】:2018-03-02 21:42:49
【问题描述】:

为什么这个宏有效? (确实如此)循环能够开始,尽管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;

【问题讨论】:

    标签: sas do-loops


    【解决方案1】:

    您的问题的简短回答是:是的,SAS 在循环执行之前读取可用的行数。事实上,SAS 在数据步骤执行之前读取可用的行数;它是在数据步骤编译时确定的。例如,请参阅 this paperthis paper 等。

    具体见SAS documentation for SET

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

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

    【讨论】:

    • 另外值得注意的是,使用firstobs 而不是point 可以更轻松地完成此操作,因为确定观察的数量是多么微不足道。效率更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多