SAS - 缺少价值替换“。”数字为0但不是日期

时间:2016-11-16 10:46:39

标签: arrays macros sas

我有一个SAS宏:

%MACRO missing_values (ds);
    DATA &ds. (drop=_i);
        SET &ds. ;
        ARRAY A_VarNum[*] _NUMERIC_;
        DO _i = 1 TO dim(A_VarNum);
            IF A_VarNum (_i)=. THEN A_VarNum (_i)=0 ;
        END;
    RUN;
%MEND;

.替换为0,但我希望这些日期保持原样,以便它们不会被01/01/1960取代。

这可能吗?

2 个答案:

答案 0 :(得分:0)

日期变量是否分配了格式?它们都一样吗? 在这种情况下,您可以使用VVALUE函数检查格式化的值'01 / 01/1960',并将值更改回缺失值。 效率不高,但SAS并不擅长检查日期。

data test;
format e ddmmyy10.;
    do i = 1 to 10;
     e = .;
     f =.;
     output;
    end;
run;

%MACRO missing_values (ds);
    DATA &ds. (drop=_i);
        SET &ds. ;
        ARRAY A_VarNum[*] _NUMERIC_;
        DO _i = 1 TO dim(A_VarNum);
            IF A_VarNum (_i)=. THEN DO;
                A_VarNum (_i)=0;
                IF VVALUE(A_VarNum (_i))='01/01/1960' THEN A_VarNum (_i)=.;
            END ;
        END;
    RUN;
%MEND;
%missing_values(test);

答案 1 :(得分:0)

如果您从未期望在您的日期变量中遇到1960年1月1日,则另一个选项是定义显示该日期缺失值的自定义日期格式,例如

proc format;
 value mydate
  low--1 = [yymmdd10.]
   0     = '.'
   1-high= [yymmdd10.]
   ;
run;

data _null_;
 format datevar mydate10.;
 do datevar = -1,0, 24000;
  put datevar=;
 end;
run;

输出:

 datevar=1959-12-31
 datevar=.
 datevar=2025-09-16