2016-09-09 43 views
0

数値変数のNULL値を0で埋めるには次のようにします。日付以外の数値変数に対してのみnull値を入力するにはどうすればよいですか?SAS - 日付変数ではなくヌル値を入力します。日付は含みません。

data mydataset; 
set mydataset; 
    array myarray _numeric_; 
    do over myarray; 
    if myarray=. then myarray=0; 
    end; 
run; 
+1

SASでは、日付変数は数値変数です。したがって、日付変数を識別する方法が必要です。日付変数に日付形式(例:Mmddyy10)が添付されていますか?それはそれらを特定する方法になります。 – Quentin

+1

@ Quentinの答えに加えて、 'vformat'関数を調べて各配列変数のフォーマットを取得します。 'do do'も非難されています。 –

答えて

0

変数が日付であるかどうかを判断するためのSASコミュニティに関する優れた記事があります。利用可能なのはhereです。あなたの質問は、日付フォーマット(proc format)のように動作するユーザー定義フォーマットについても忘れてはいけないので、簡単なことではありません。すべての日付変数が1つの形式であるとしましょう。 「

  • ライブラリ名、
  • データセット名、
  • と目的の形式名:

    data test; 
        format x y z datetime8.; 
    
        x = .; 
        y = .; 
        z = .; 
    run; 
    
    %macro get_vars_format(lib, tab, fmt); 
        proc sql noprint; 
         select name into :names separated by ' ' 
         from sashelp.vcolumn 
         where libname = "&lib." and 
         memname = "&tab." and 
         format eq "&fmt."; 
        quit; 
    
        %put Names: &names.; 
    
        data work.test; 
         set &lib..&tab.; 
    
         %let i = 1; 
         %let name = %scan(&names., &i., %str()); 
    
         %do %while(&name. ne); 
          if &name. eq . then &name = 0; 
          output; 
    
          %let i = %eval(&i + 1); 
          %let name = %scan(&names., &i., %str()); 
         %end; 
        run; 
    %mend get_vars_format; 
    
    %get_vars_format(lib=WORK, tab=TEST, fmt=DATETIME8.); 
    

    このマクロは、3つの引数を取ります。

私は、マクロ変数にすべての変数名を保存しています(彼らはスペース記号で区切られて)、次のステップで、私はループでこれを反復しています(inameマクロ変数に注意してください)。すべての行について、指定された形式の変数の値が.に等しい場合は、0に置き換えます。変数に日付形式が指定されている場合、0Jan 01, 1960として扱われることに注意してください。これは、SAS日付価値規約の最初の日です。

関連する問題