将'where'条件从SAS翻译为R.

时间:2014-02-22 08:42:18

标签: r sorting sas where-clause language-translation

我有一个SAS宏,我需要转换为R,因为我是SAS的新手,我在理解代码的一部分时遇到了一些麻烦。

在宏的开头,我有这行定义宏 -

%MACRO macroname(sdate=01JAN2011,edate=01JAN2013, FILTERS=platform in (1,2,3),OUT=data_final)

%if %length(&filters) > 2 %then %let filters = and &filters; 
%else %let filters = %str( );

在宏的一个阶段中,我有以下命令 -

proc sort data = A noduplicates;
  where 1 &filters;
  by id, date;
  run;

据我所知,在where条件下,将应用过滤条件。但是1做了什么?类似地,过滤器列上的if else条件有什么作用?

谢谢!

1 个答案:

答案 0 :(得分:2)

这也可以写成1 = 1,并且基本上是静态TRUE条件。

这实际上是一个巧妙的小技巧,可以解决添加多个where子句(作为宏变量)的问题。每个条件必须由运算符分隔(AND / OR,通常为AND),但并不总是知道另一个条件是否在之前。例如,您可能希望灵活地将相同的&filter添加到这两个地方:{/ p>

where x=1 &filter;

where &filter;

当然第一个示例必须解析为x=1 AND some=filter;,第二个示例必须解析为where AND some=filter;

请记住,where子句中的任何条件最终都会解析为true或false。通过添加“1”,我们有一个静态的“TRUE”条件,它对查询没有影响,但确实给了我们代码的灵活性(和可读性)(基本上避免了更多的宏%if%else 语句)如果我们总是将“AND”添加到& filter。

where 1 &filter  

而不是

where %if %length(&filter)>4 and "%substr(%upcase(&filter))" ne AND %then %do;
   where 1 and &filter
%end;
%else %do;
   where &filter
%end;