#SAS#月份循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#SAS#月份循环相关的知识,希望对你有一定的参考价值。

参考技术A 因为工作的原因,开始接触sas。不得不说用起来很不习惯,所以只能从新手开始,一步步升级了。

最近有个需求,需要拿月末的表,表名称都是按照test_201801这样的格式命名。需要在宏里面执行。

sas的格式转换用起来很别扭,尤其在宏里面。折腾了好久,最后还是没成功,最后向别人请教,是通过另外的方式,换算得到的,这里记录一下,以便日后翻查。

```

%macro test();

%do mth=201701 %to 201802;

%if %substr(&mth., 5, 2)=13 %then %let mth=%eval(&mth.+88);

%put test_&mth.;

%mend test;

%test;

```

f3执行后,查看输出。

以后工作中碰到新的技巧,也会慢慢记录下来

SAS do-Loops和set语句

为什么这个宏工作? (确实如此)循环能够启动,尽管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读取循环执行之前可用的行数。实际上,SAS在数据步骤执行之前读取可用的行数;它是在数据步骤编译时确定的。例如,参见this paperthis paper等。

具体来看SAS documentation for SET

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

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

以上是关于#SAS#月份循环的主要内容,如果未能解决你的问题,请参考以下文章

SAS 对变量进行组内编号、循环编号、递增编号和有限重复循环编号

在 Oracle PL/SQL 中复制 SAS DO 循环

SAS宏变量如何使用循环读取不同变量名?

SAS 宏命令 循环

SAS 宏循环使用单引号的多个“yyyy-mm-dd”日期格式

在SAS中使用Arrays for循环