【问题标题】:Creating prompt for missing and nonmissing为缺失和非缺失创建提示
【发布时间】:2014-04-25 14:03:45
【问题描述】:

我正在尝试为缺失或非缺失选项添加提示。此代码不起作用,需要修复它。 rec_And_issues 是我在报告中创建的一个新表。需要选择 rec_and_issues.SFVFDBK_FEEDBACK_COMMENTS 是否缺失。

 %macro missing_or_nonmissing;
%if "&sel_issue" eq "Missing" %then %do;
DATA rec_and_issues;
set rec_and_issues;

 rec_and_issues.SFVFDBK_FEEDBACK_COMMENTS is null;
run;
%end;

%else %if "&sel_issue" eq "NonMissing" %then %do;
DATA rec_and_issues; 
set rec_and_issues;
rec_and_issues.SFVFDBK_FEEDBACK_COMMENTS is not null;
run;  
%end;
%mend missing_or_nonmissing;

【问题讨论】:

    标签: macros sas prompt


    【解决方案1】:

    您不应该将数据步骤放在宏中。您决定如何执行此操作取决于样式 - 如果很容易避免,我不喜欢在宏中包含 WHERE,因为这使某人更容易阅读和理解您的代码 - 但对此的任何变化都应该没问题.仅将部分数据步放入宏中实际变化的部分。

    %macro missing_or_nonmissing(sel=);
      %let not = %sysfunc(ifc(&sel=NonMissing,not,));
      SVFDBK_FEEDBACK_COMMENTS is &not. null
    %mend missing_or_nonmissing;
    
    DATA rec_and_issues;
      set rec_and_issues;
      where %missing_or_nonmissing(sel=&sel_issue) ;
    run;
    

    除此之外没有理由做任何事情。此外,如果您将某物用作参数,请将其用作参数。在大多数情况下,全局变量不应该在宏中使用,在这种情况下绝对不能使用,因为它显然是宏的参数。

    此外,您可能根本不需要这样做。如果这只是过滤数据集,那么几乎可以肯定,只要您实际使用数据集(或创建数据集时,取决于它是如何创建的),您就可以执行此操作。例如,如果您的下一步是 PROC SORT,通常情况下,您应该在 PROC SORT 中执行此操作 - 而此宏可让您执行此操作。 (这就是我喜欢将WHERE 排除在外的原因——因为数据集选项的语法不同)。

    proc sort data=rec_and_issues(where=(%missing_or_nonmissing(sel=&sel_issue.)));
    by idvar;
    run;
    

    最后,如果您是创建提示的人,我建议您将基础值设为 1/0 而不是文本。这样您就不必担心大写等问题,并且可以更轻松地使用它们(因为 1 是“真”而 0 是“假”)。

    【讨论】:

    • 如果可以的话,你能检查我下面的问题吗!感谢帮助。我在这个问题之后添加了另一个答案。谢谢
    • 您不会在答案中添加后续问题。答案是为了答案。如果简单,请在 cmets 中提问,如果不是,请在新问题中提问,如果它是新的,或者如果只是对这个问题的澄清,请在上面的问题中提问。
    【解决方案2】:

    您的数据步骤的语法不正确。您使用了某种形式的 sql 两级变量命名,它在 SAS 数据步骤中不起作用。 WHERE 声明会起作用。我重写了宏:

    %macro missing_or_nonmissing;
    %if "&sel_issue" eq "Missing" %then %do;
    DATA rec_and_issues;
      set rec_and_issues;
    
      where SVFDBK_FEEDBACK_COMMENTS is null;
    run;
    %end;
    
    %else %if "&sel_issue" eq "NonMissing" %then %do;
    DATA rec_and_issues; 
      set rec_and_issues;
    
      where SFVFDBK_FEEDBACK_COMMENTS is not null;
    run;  
    %end;
    %mend missing_or_nonmissing;
    

    虽然您可以使宏更短,因为只有操作符会发生变化:

    %macro missing_or_nonmissing;
    %if "&sel_issue" eq "Missing" %then %let op=;
    %else %if "&sel_issue" eq "NonMissing" %then %let op=not;
    %else %goto exit;
    
    DATA rec_and_issues;
      set rec_and_issues;
    
      where SVFDBK_FEEDBACK_COMMENTS is &op. null;
    run;
    
    %exit:
    %mend missing_or_nonmissing;
    

    在下面添加这些行来运行宏:

    %let sel_issue = Missing; * or NonMissing;
    
    %missing_or_nonmissing;
    

    当此宏运行时,您的代码将覆盖rec_and_issues 表,无论SVFDBK_FEEDBACK_COMMENTS 值是否缺失。要改为创建一个新表(并保留 rec_and_issues 表),请在 data 语句中放置一个不同的表名。

    【讨论】:

      【解决方案3】:

      在 Joe 的回答的基础上,您甚至可以在没有宏的情况下使其工作,只需使用宏变量,如下所示:

      %let not = %sysfunc(ifc(&sel=NonMissing,not,));
      
      DATA rec_and_issues;
        set rec_and_issues;
        where SVFDBK_FEEDBACK_COMMENTS is &not null;
      run;
      

      【讨论】:

        猜你喜欢
        • 2016-12-04
        • 2020-04-09
        • 2020-11-22
        • 2020-12-28
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多