2016-11-16 27 views
0

のために、私はSASマクロがあります。0によって.置き換え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; 

を、私は、彼らが01で置換されないように、日付は、彼らが道に滞在することを希望/ 1960年1月。

これは可能ですか?

+0

あなたの日付変数は、特定の形式を持っていますか?その場合は、VFORMAT()を使用して変数を識別し、ループ内でそれらをスキップできます。 – Reeza

答えて

0

日付変数には形式が割り当てられていますか?彼らはすべて同じですか? その場合、VVALUE関数を使用してフォーマットされた値'01/01/1960 'をチェックし、値を欠損に戻すことができます。 あまり効率的ではありませんが、SASは日付を確認するのにあまりよくありません。あなたは日付変数で1960年1月1日に遭遇することが予想されることはありません場合は

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

は、別のオプションは、例えば、その日の欠損値を表示するカスタム日付形式を定義することです

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 
関連する問題