【问题标题】:Passing SAS dataset column as macro parameter将 SAS 数据集列作为宏参数传递
【发布时间】:2017-06-08 11:35:39
【问题描述】:

我有一个带有值的 SAS 数据集

yyyymm
201605
201606
201607
201608
201609

我正在尝试找到一种方法,一次将这些值传递给宏,这样

do while dataset still has value
%macro passdata(yyyymm);
end

如何在 SAS 中执行此操作。有人可以帮忙提供一个示例/代码 sn-p。

【问题讨论】:

  • 你在上面所做的听起来更像你不需要宏,只需要一个普通的数据步骤。 data want; set your_dataset; run; 似乎正是这样做的。你能解释一下为什么这不能满足你的需要吗? %passdata 在做什么?
  • 查看 CALL EXECUTE。该文档可能正好包含您正在寻找的示例,否则,这里是一个完全编码的示例gist.github.com/statgeek/beb97b1c6d4517dde3b2

标签: macros sas sas-macro


【解决方案1】:

正如前面的评论所提到的,传递参数的一种方法是通过调用执行例程。请注意,这必须在 datastep 环境中完成。这些行是从您输入的集合中读取的。

您可以输入多个变量。只需在 '||' 中添加更多变量分隔符。请注意,变量中可能有很多空格。 (==谨慎比较。)

这是一个小示例代码。经过测试。

data start_data;
    input date_var ;
    datalines;
        201605
        201606
        201607
        201608
        201609
        ;
run;

%macro Do_stuff(input_var);
    %put 'Line generates value ' &input_var;
%mend do_stuff;

data _null_;
    set start_data;
    call execute('%do_stuff('||date_var||')'  );
run;

【讨论】:

    【解决方案2】:

    试试这个例子并尝试修改以满足您的需求...从“源”数据集中,我们可以使用调用 symput() 为每个观察分配一个宏标记(由 SAS 自动数据集变量区分 n 所以 My_token1、My_token2 等)一旦定义了一组宏变量,只需循环它们!该程序会将所有单独的记录从源打印到 SAS 日志:

    data source;
    do var=1000 to 1010;
    output;
    end;
    run;
    
    data _null_;
    set source;
    call symput(compress("My_token"||_n_),var);
    run;
    
    %put &my_token1  &my_token4;
    
    %Macro neat;
    
    %do this=1 %to 11;
    
    *Check the log.;
    %put &&My_token&this;
    
    %end;
    
    %mend;
    %neat;
    

    【讨论】:

    • 没有解释的代码不是一个好的答案。请解释发生了什么以及为什么这是一个很好的解决方案,而不仅仅是提供代码。
    • 根据您的建议,我添加了一些上下文。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多