我有一个需要转换为R的SAS宏,由于我不熟悉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 = 1,本质上是静态的TRUE条件。
这实际上是一个巧妙的小技巧,解决了添加多个where子句(作为宏变量)的问题。每个条件都必须由运算符(AND / OR,通常为AND)分隔,但是并不总是知道在您要添加的条件之前是否有其他条件。例如,您可能希望灵活地&filter
在claueses的这两个位置中添加相同的内容:
where x=1 &filter;
where &filter;
当然,第一个示例必须解决,x=1 AND some=filter;
第二个必须不解决where AND some=filter;
请记住,where子句中的任何条件最终都会解析为true或false。通过加“1”,我们有一个静态的“真”条件,即对查询没有影响,但确实给我们的灵活性(和可读性)代码(基本上避免了更宏观%,如果%其他语句),如果我们总是在前面加上“ 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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句