【问题标题】:Creating datasets within Macro SAS在宏 SAS 中创建数据集
【发布时间】:2015-06-29 18:23:10
【问题描述】:

我有以下代码:

%macro MSA (Data=, Code=, MSAName=);
    data &Data;
    set NoDup;
        %if MSA = &Code %then %do; 
        MSA_name = "&MSAName";
        output &data;
   %end; 
   run; 
   %mend MSA;
   %MSA (Data=Bakersfield, Code=12540, MSAName=Bakersfield);
   %MSA (Data=Chico,       Code=17020, MSAName=Chico);

所以我得到了两个我想要的数据集,一个名字是 Bakersfield,另一个是 Chico。但是,MSA 列没有显示正确的值(即 Bakersfield 的列 12540 和 MSA 的 Chico 的 17020 列),我也没有得到一个名为 MSA_Name 的变量,它给了我正确的值(所有 MSA_Name 列的贝克斯菲尔德,和奇科)。我究竟做错了什么?

【问题讨论】:

  • 要清楚发生了什么:宏语句只是生成将要执行的 SAS 语句。 MSA = 12540; 为假(宏处理器不访问数据集中的变量,它只是比较文本),因此执行以下代码:data Bakersfield; set NoDup; run;。你只是在复制你的数据集。
  • 你完全正确。解决办法是什么?

标签: sas sas-macro


【解决方案1】:

您的代码存在的问题是将宏语法与数据步骤混合在一起。请尝试以下方法:

%macro MSA (Data=, Code=, MSAName=);
    data &Data;
    set NoDup;
        if MSA = &Code /*if MSA is char, you will need quote "&code"*/ then  do;
        MSA_name = "&MSAName"; output; end;
      run; 
   %mend MSA;
   %MSA (Data=Bakersfield, Code=12540, MSAName=Bakersfield);
   %MSA (Data=Chico,       Code=17020, MSAName=Chico);

【讨论】:

  • 这段代码的结果和我的没有什么不同。
  • 此解决方案中没有 %-sign IF、THEN 等。原始代码使用 %IF 并且当 MSA 是观察而不是宏变量时它不起作用。确定没有区别?
  • @user2916331 他拿出了你的输出语句。改用这样的do 块:if MSA = "&Code" then do; MSA_name = "&MSAName"; output; end;
  • @DWal,为什么在隐式“输出”到位并且做完全相同的事情时需要显式“输出”?
  • 需要显式 OUTPUT 以使输出数据集成为输入数据集的子集。否则程序只是复制数据并仅为部分记录生成 MSA_NAME。
猜你喜欢
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多