2016-11-24 53 views
0
if &var. not in ('quarter' 'period' 'year') then do; 
    proc sort data=test_&var.; 
     by descending column1; 
    run; 
end; 

我试图在proc sort语句之前附加一个条件语句,但我无法让IF在数据步骤之外工作。有没有办法解决这个问题?SAS如果在PROC PROCEDURE前有条件

基本上我不想排序任何test_ &变种。包含一个时间变量,那些是唯一的数据集的数据集我想保留特定顺序

+0

您需要使用宏逻辑代替if/then变为%if if%then,但是您还需要使用一个宏,完全包装它。 – Reeza

+0

是@Reeza我试过,但返回一个错误,说:“操作数中找到一个字符操作数是必需的。” 是否需要一些额外的代码让SAS读取具有宏变量的if语句正确? – Wolfspirit

+1

下面的答案是非常彻底的。一般来说,如果你说某件事情没有显示任何代码,那么你不可能得到任何帮助,因为我们不知道什么是错的。 – Reeza

回答

3

这里是一个宏观的例子:

/* tell macro language to recognise the in operator */ 
options minoperator; 

/* demo data */ 
data test_yymm; column1=1;run; 
data test_quarter; column1=1;run; 

%macro demo(var) ; 
/* remove quotes, place not outside the condition */ 
%if not (&var in quarter period year) %then %do; 
    proc sort data=test_&var.; 
     by descending column1; 
    run; 
%end; 
%mend; 

/* call macro */ 
%demo(yymm); 
%demo(quarter); 

你也可以做到这一点在数据一步,通过调用call execute

%let var=yymm; 
data _null_; 
    if "&var" not in ('quarter' 'period' 'year') then do; 
    call execute(" 
     proc sort data=test_&var.; 
     by descending column1; 
     run; 
    "); 
    end; 
run; 

请记住,SAS宏语言是基于文本的,所以变量不需要被引用。与常规SAS代码不同,字符串文字DO需要被引用以便被识别。

+1

非常好,不知道那个'选项'! 好的提示和技巧在这里嵌套数据步骤中的proc步骤。干杯。 – Wolfspirit