2016-09-09 279 views
0

我使用以下內容爲0填充數值變量的空值,但這也適用於日期變量。我如何才能爲非日期數字變量填充空值?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 over'已被棄用。 –

回答

0

在SAS Communities上有一篇關於確定變量是否爲約會的優秀帖子。它可用here。你的問題不是微不足道的,因爲你不應該忘記用戶定義的格式,它也可以像日期格式一樣行事(proc format)。假設所有的日期變量都是一種格式。

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.); 

這個宏有三個參數:」

  • 庫名,
  • 數據集名,
  • 和所需的格式名稱。

我保存所有變量的名稱爲宏觀變量(他們用空格號分隔),並在接下來的步驟,我在一個循環迭代這個(注意iname宏觀變量)。對於每一行,如果給定格式的任何變量的值等於.,則將其替換爲0。請注意,如果變量具有日期格式,則0將被視爲Jan 01, 1960,因爲這是SAS日期值約定中的第一天。