0
我使用以下內容爲0填充數值變量的空值,但這也適用於日期變量。我如何才能爲非日期數字變量填充空值?SAS - 爲數字變量填入空值,但不填寫日期
data mydataset;
set mydataset;
array myarray _numeric_;
do over myarray;
if myarray=. then myarray=0;
end;
run;
我使用以下內容爲0填充數值變量的空值,但這也適用於日期變量。我如何才能爲非日期數字變量填充空值?SAS - 爲數字變量填入空值,但不填寫日期
data mydataset;
set mydataset;
array myarray _numeric_;
do over myarray;
if myarray=. then myarray=0;
end;
run;
在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.);
這個宏有三個參數:」
我保存所有變量的名稱爲宏觀變量(他們用空格號分隔),並在接下來的步驟,我在一個循環迭代這個(注意i
和name
宏觀變量)。對於每一行,如果給定格式的任何變量的值等於.
,則將其替換爲0
。請注意,如果變量具有日期格式,則0
將被視爲Jan 01, 1960
,因爲這是SAS日期值約定中的第一天。
SAS日期變量是數字變量。所以你需要一種方法來識別日期變量。你的日期變量是否附有日期格式(例如Mmddyy10)?這可能是一種識別它們的方法。 – Quentin
除了@ Quentin的回答,請查閱'vformat'函數來獲取每個數組變量的格式。另外'do over'已被棄用。 –