何时在SAS中使用IF或%IF

时间:2013-03-12 13:42:16

标签: sas sas-macro

我是SAS的新手,并且很难确定何时应该使用简单的If-Then-else以及何时应该使用%IF-%THEN-%ELSE。作为下面的示例代码:

%let inFile = %scan(&sysparm, 1, " ");
%macro read_data(infile);
data want;
infile "&infile" LRECL=1000;
retain fdate;
if _n_ = 1 then do;
  input Agency $ Status $ Num $ fdate sdate;
end;
else do;
   %if fdate < 20130428  %then
   input
   @1   poolno                  $6.
   @7   factor                  9.8 @;
   %else
   input
   @1   rectype                 $1
   @3   poolno                  $6.
   @9   factor                  9.8 @;

   @18 pfactor                 9.8;
output;
end;
drop Agency Status Num sdate;
run;
proc print data=want;
run;
%mend read_data;
%read_data(&inFile);

我正在尝试获取第一行(标题)并获取参数fdate。根据此参数的值,我将以不同方式解析后续输入行。 但这似乎不起作用,因为只有第二个输入部分运行(总是在输出中得到参数&#39; rectype&#39;)。

我可能做错了什么建议?

4 个答案:

答案 0 :(得分:2)

我发现你有C ++作为你的标签之一,而你刚刚开始使用SAS。所以我会尝试根据您的背景提供答案。

了解SAS宏命令与DATA步骤或多个具有相同名称的过程中的命令之间区别的最简单方法,例如%if vs. if ,将SAS宏命令视为等效于C / C ++预处理器(CPP)指令。 CPP和SAS MAcro都是宏语言,虽然它们不是完全相同的语言,但它们共有两个重要的,最初令人困惑的特征:它们是文本处理器;它们在主代码处理之前作为单独的步骤执行。

有些地方会出现这种近似值,但作为初学者,在C / C ++中有背景,这是一个很好的起点。

答案 1 :(得分:1)

在任何数据步骤语句之前编译宏语句%if。这意味着您通常无法在逻辑表达式中使用数据步变量。当宏处理器正在编译宏语句时,数据步骤变量尚不存在。

答案 2 :(得分:0)

在上面的示例中,%IF条件基于datastep变量/值。这应该表明可以使用datastep“if”而不是%IF来实现。

您之前的问题https://stackoverflow.com/a/15341502/108797

已经收到了相应答案

答案 3 :(得分:0)

如果您执行%if fdate < 20130428 SAS,则不会比较文字fdate20130428 值od fdate20130428

如果你有一个名为fdate的宏变量,你可以%if &fdate < 20130428

在您的情况下,fdate是数据集中的变量,因此请使用if而非%if,但您似乎正在尝试使用宏创建数据步骤,以便使用if可能在这种情况下不起作用(取决于你想要得到什么)。