自动检查不同值SAS的数量

时间:2018-04-24 10:25:20

标签: sas

希望自动执行某些检查并将一些警告打印到日志文件中。我想我已经掌握了一般性的想法,但是我在检查这些问题时遇到了问题。

例如,我有两个数据集my_data1my_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;

如何设置检查nmy_data2的不同值的数量?

2 个答案:

答案 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.vtabledictionary.tables获取计数。请注意,您只能使用dictionary.tables查询proc sql