2016-11-16 45 views
0

我有一個SAS宏:SAS - 缺少值替換「。」由0數字,但沒有日期

%MACRO missing_values (ds); 
    DATA &ds. (drop=_i); 
     SET &ds. ; 
     ARRAY A_VarNum[*] _NUMERIC_; 
     DO _i = 1 TO dim(A_VarNum); 
      IF A_VarNum (_i)=. THEN A_VarNum (_i)=0 ; 
     END; 
    RUN; 
%MEND; 

它取代.0,但我想是入住時間段會是這樣的,使他們不被01替換/ 01/1960。

這可能嗎?

+0

做你的日期變量有一個特定的格式?如果是這樣,您可以使用VFORMAT()來標識變量並在循環中跳過它們。 – Reeza

回答

0

日期變量是否分配了格式?他們都一樣嗎? 在這種情況下,您可以使用VVALUE函數檢查格式化的值'01/01/1960',並將值更改爲丟失。 效率不高,但SAS並不是很擅長檢查日期。

data test; 
format e ddmmyy10.; 
    do i = 1 to 10; 
    e = .; 
    f =.; 
    output; 
    end; 
run; 

%MACRO missing_values (ds); 
    DATA &ds. (drop=_i); 
     SET &ds. ; 
     ARRAY A_VarNum[*] _NUMERIC_; 
     DO _i = 1 TO dim(A_VarNum); 
      IF A_VarNum (_i)=. THEN DO; 
       A_VarNum (_i)=0; 
       IF VVALUE(A_VarNum (_i))='01/01/1960' THEN A_VarNum (_i)=.; 
      END ; 
     END; 
    RUN; 
%MEND; 
%missing_values(test); 
0

如果你從來沒有想到會遇到在你的日期變量1960年1月1日,另一種選擇是定義該日期顯示缺失值自定義日期格式,例如:

proc format; 
value mydate 
    low--1 = [yymmdd10.] 
    0  = '.' 
    1-high= [yymmdd10.] 
    ; 
run; 

data _null_; 
format datevar mydate10.; 
do datevar = -1,0, 24000; 
    put datevar=; 
end; 
run; 

輸出:

datevar=1959-12-31 
datevar=. 
datevar=2025-09-16