【问题标题】:SAS: How to create datasets in loop based on macro variableSAS:如何基于宏变量循环创建数据集
【发布时间】:2020-03-17 09:40:29
【问题描述】:

我有一个这样的宏变量:

%let months = 202002 202001 201912 201911 201910;

如您所见,我们有 5 个月,用空格 ' ' 分隔。

我想创建 5 个数据集,例如 a_202002, a_202001, a_201912, a_2019_11, a_201910。我怎样才能循环运行它并创建 5 个数据集,而不是编写数据步 5 次?

伪代码:

for m in &months.
    data a_m;
        ....
        ....
    run;

如何在 SAS 中做到这一点?我试过%do_over,但这对我没有帮助。

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    使用您在之前的问题中从@Tom 回答中获得的知识来创建宏

    %macro datasets_for_months ...
      ...
    %mend;
    

    DATA语句中指定输出数据集:

    DATA %datasets_for_months(...);
      ...
    RUN;
    

    通过命名数据集将行定向到特定的输出数据集,例如

      OUTPUT a_202002;
    

    注意:

    • 没有 OUTPUT 语句的步骤将隐式输出到每个数据集
    • 带有OUTPUT 语句的步骤将导致记录写入所有数据集,或仅写入语句中指定的数据集:
      • OUTPUT 将记录写入所有输出数据集
      • OUTPUT data-set-name-1 仅将记录写入指定的数据集

    DATA Step 文档详细介绍了您需要了解的内容

    数据声明
    开始一个 DATA 步并为任何输出提供名称,例如 SAS 数据集、视图或程序。
    ...
    语法

    表格 1:
    用于创建输出数据集的 DATA 语句

    DATA <data-set-name-1 <(data-set-options-1)>>
    ... <data-set-name-n <(data-set-options-n)>> ... ;

    前路

    您可能会发现month 在概念上更适合用作单个大型数据集中的分类变量,而不是将数据分解为多个以月份命名的数据集。

    分类变量可让您利用 SAS 的分区和隔离语句的强大功能,例如 WHEREBYCLASS,在以不同的类级别值组合处理、报告和可视化您的数据时。

    【讨论】:

    • 实际上,使用汤姆的答案作为模板,我正在尝试解决这个问题。但问题是我必须使用infile 语句导入文本文件,并且每个月的数据位于月份文件夹中,如202002202001 等。
    • SAS 可以一步读取多个文件。当文件具有相同结构时,所有数据都可以通过one步骤轻松读入one数据集。
    • 与 Richard 相呼应,您可以从多个文件中读取数据,或者拥有一个带有文件名的数据集,然后再读取每个文件名。所有文件的结构都完全相同吗? communities.sas.com/t5/SAS-Communities-Library/…
    【解决方案2】:

    这种方法怎么样?在另一个宏变量中创建数据集名称并使用单个数据步骤。

    %let months = 202002 202001 201912 201911 201910;
    
    data _null_;
       ds = prxchange('s/(\d+)/a_$1/', -1, "&months.");
       call symputx('ds', ds);
    run;
    
    options symbolgen;
    data &ds.;
    run;
    

    【讨论】:

      【解决方案3】:

      您可以使用 %DO 循环和 %SCAN() 函数。使用 COUNTW() 函数求上界。

      %do i=1 %to %sysfunc(countw(&months,%str( )));
        %let month=%scan(&months,&i,%str( ));
        ....
      %end;
      

      【讨论】:

      • 谢谢汤姆。那是另一种方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多