我使用以下内容为0填充数值变量的空值,但这也适用于日期变量。如何仅为非日期数字变量填写空值?
data mydataset;
set mydataset;
array myarray _numeric_;
do over myarray;
if myarray=. then myarray=0;
end;
run;
答案 0 :(得分:0)
SAS社区中有关于确定变量是否为日期的优秀帖子。它可用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日期值约定中的第一天。