2016-01-20 338 views
2

SAS正在將in_year_tolerance和abs_cost解釋爲下面if語句中的文本變量。因此,if語句正在測試變量的字母順序,而不是數字順序。我如何讓SAS將它們視爲數字?我試圖在%sysevalf中粘貼if條件和宏變量,但這沒有什麼區別。 in_year_tolerance是10,000,000,成本可能會有所不同,但在測試運行約20,000,000開始之前,下降到9,000,000,此時它應該退出循環,但不會。如何強制SAS在if條件下將宏變量解釋爲數字

%macro set_downward_caps(year, in_year_tolerance, large, small, start, end, increment); 
%do c = &start. %to &end. %by &increment.; 
    %let nominal_down_large_&year. = %sysevalf(&large. + (&c./1000)); 
    %let nominal_down_small_&year. = %sysevalf(&small. + (&c./100)); 
    %let real_down_large_&year. = %sysevalf((1 - &&nominal_down_large_&year.) * &&rpi&year.); 
    %let real_down_small_&year. = %sysevalf((1 - &&nominal_down_small_&year.) * &&rpi&year.); 
    %rates(&year.); 
    proc means data = output.s_&scenario. noprint nway; 
     var transbill&year.; 
     output out = temporary (drop = _type_ _freq_) sum=cost; 
    run; 
    data _null_; 
     set temporary; 
     call symputx('cost', put(cost,best32.)); 
    run; 
    data temp; 
     length scenario $ 30; 
     scenario = "&scenario."; 
     large = &&real_down_large_&year.; 
     small = &&real_down_small_&year.; 
     cost = &cost.; 
    run; 
    data output.summary_of_caps; 
     set output.summary_of_caps temp; 
    run; 
    %let abs_cost = %sysevalf(%sysfunc(abs(&cost))); 
    %if &in_year_tolerance. > &abs_cost. %then %return; 
%end; 
%mend set_downward_caps; 

回答

1

使用%sysevalf(&in_year_tolerance > &abs_cost,boolean)

正如您所見,比較基於文本。如果您將其放入%eval()%sysevalf(),則這些值將被解釋爲數字。

,boolean選項讓它知道你想要一個TRUE/FALSE。

+0

非常感謝。 – TaxpayersMoney