我有一个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取代。
这可能吗?
答案 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