希望自动执行某些检查并将一些警告打印到日志文件中。我想我已经掌握了一般性的想法,但是我在检查这些问题时遇到了问题。
例如,我有两个数据集my_data1
和my_data2
。如果nobs_my_data2
<我希望打印警告nobs_my_data1
。另外,如果n
中变量my_data2
的不同值的数量小于11,我希望打印警告。
一些虚拟数据和第一次检查的尝试:
%LET N = 1000;
DATA my_data1(keep = i u x n);
a = -1;
b = 1;
max = 10;
do i = 1 to &N - 100;
u = rand("Uniform"); /* decimal values in (0,1) */
x = a + (b-a) * u; /* decimal values in (a,b) */
n = floor((1 + max) * u); /* integer values in 0..max */
OUTPUT;
END;
RUN;
DATA my_data2(keep = i u x n);
a = -1;
b = 1;
max = 10;
do i = 1 to &N;
u = rand("Uniform"); /* decimal values in (0,1) */
x = a + (b-a) * u; /* decimal values in (a,b) */
n = floor((1 + max) * u); /* integer values in 0..max */
OUTPUT;
END;
RUN;
DATA _NULL_;
FILE "\\filepath\log.txt" MOD;
SET my_data1 NOBS = NOBS1 my_data2 NOBS = NOBS2 END = END;
IF END = 1 THEN DO;
PUT "HERE'S A HEADER LINE";
END;
IF NOBS1 > NOBS2 AND END = 1 THEN DO;
PUT "WARNING!";
END;
IF END = 1 THEN DO;
PUT "HERE'S A FOOTER LINE";
END;
RUN;
如何设置检查n
中my_data2
的不同值的数量?
答案 0 :(得分:2)
proc sql
方式 -
%macro nobsprint(tab1,tab2);
options nonotes; *suppresses all notes;
proc sql;
select count(*) into:nobs&tab1. from &tab1.;
select count(*) into:nobs&tab2. from &tab2.;
select count(distinct n) into:distn&tab2. from &tab2.;
quit;
%if &&nobs&tab2. < &&nobs&tab1. %then %put |WARNING! &tab2. has less recs than &tab1.|;
%if &&distn&tab2. < 11 %then %put |WARNING! distinct VAR n count in &tab2. less than 11|;
options notes; *overrides the previous option;
%mend nobsprint;
%nobsprint(my_data1,my_data2);
如果由于.
而必须使用数据集指定libnames,则会中断。并且,您可以使用proc printto log
将其打印到文件中。
对于您的其他部分,只需打印%put
即可将上述内容用作通话 -
filename mylog temp;
proc printto log=mylog; run;
options nomprint nomlogic;
%nobsprint(my_data1,my_data2);
proc printto; run;
除自定义警告外,这不会将任何错误文本打印到SAS日志。
答案 1 :(得分:0)
@samkart提供了可能是最直接,易于理解的方法来比较数量。另一个考虑因素是表现如果您的数据集有数百万个障碍物,您可以在不读取整个数据集的情况下获取它们。
一种方法是在nobs=
语句中使用set
选项,就像在代码中一样,但不必要地读取数据集。以下将得到计数并比较它们而不读取所有观察结果。
62 data _null_;
63 if nobs1 ne nobs2 then putlog 'WARNING: Obs counts do not match.';
64 stop;
65 set sashelp.cars nobs=nobs1;
66 set sashelp.class nobs=nobs2;
67 run;
WARNING: Obs counts do not match.
另一种选择是从sashelp.vtable
或dictionary.tables
获取计数。请注意,您只能使用dictionary.tables
查询proc sql
。