创建缺失和非缺失的提示

时间:2014-04-25 14:03:46

标签: macros sas prompt

我正在尝试添加缺失或非缺失选项的提示。这段代码不起作用,需要解决这个问题。 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;

3 个答案:

答案 0 :(得分:2)

您不应将数据步骤放在宏中。你决定如何做到这一点取决于风格 - 我喜欢在宏中不包含WHERE,如果它很容易避免,因为这使得人们更容易阅读和理解你的代码 - 但是这应该有任何变化。没事的。只将datastep的一部分放在实际变化的宏中。

%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而不是文本。这样你就不用担心upcase / etc了,你可以更容易地使用它们(因为1是'true'而0是'false')。

答案 1 :(得分:0)

您的数据步骤的语法不正确。您已经使用了某种形式的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语句中添加一个不同的表名。

答案 2 :(得分:0)

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

%let not = %sysfunc(ifc(&sel=NonMissing,not,));

DATA rec_and_issues;
  set rec_and_issues;
  where SVFDBK_FEEDBACK_COMMENTS is &not null;
run;