SAS - 为数字变量填充空值,但不填写日期

时间:2016-09-09 23:49:15

标签: date sas

我使用以下内容为0填充数值变量的空值,但这也适用于日期变量。如何仅为非日期数字变量填写空值?

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

1 个答案:

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

这个宏有三个参数:'

  • 图书馆名称,
  • 数据集名称,
  • 和所需的格式名称。

我将所有变量名称保存到一个宏变量中(它们用空格符号分隔),然后在下一步中,我在循环中迭代它(注意iname宏观变量)。对于每一行,如果给定格式的任何变量的值等于.,则将其替换为0。请注意,如果变量具有日期格式,则0将被视为Jan 01, 1960,因为这是SAS日期值约定中的第一天。