在SAS-Macro中检查变量类型

时间:2016-03-09 20:00:37

标签: sas sas-macro

我试图在宏中使用proc sql和proc freq过程来总结我的变量。

以下是代码:

%macro des_freq(input= ,vars= );
  %let n=%sysfunc(countw(&vars));
  %let binary=NO;
  %do i = 1 %to &n;
    %let values = %scan(&vars, &i);
      %if %datatyp(&values)=NUMERIC %then %do;
        proc summary data = &input;
          output out=x min(&values)=minx max(&values)=maxx;
        run;
        data _null_;
          set x;
          if minx = 0 and maxx = 1 then call symputx('binary','YES');
        run;
        %if &binary = YES %then %do;
          proc sql;
            select segment_final,
                  (sum(case when &values = 1 then 1 else 0 end)/ count(*)) * 100      as &values._percent
            from &input
            group by segment_final;
          quit;
        %end;
        %else %do;
          proc freq data =&input;
            tables segment_final*&values/nofreq nopercent nocol;
          run;
        %end;
      %end;

     %else %do;
        proc freq data =&input;
           tables segment_final*&values/nofreq nopercent nocol;
        run;
     %end;
  %end;
%mend;

我的变量可以是数字或字符。如果是数字,则可以有2个不同的值。

我想通过段(因此proc sql)在一个二进制变量中的%1和每个段的所有不同变量的百分比(因此proc freq)。

我的第一个if语句是检查变量是否为数字,然后是否为数字,接下来的几个步骤是检查它的二进制是否。如果它的二进制文件然后执行proc sql else执行proc freq。

如果变量是字符,那么只需执行proc freq。

我无法弄清楚如何检查我的变量是否为数字。我试过%SYSFUNC(Vartype),%isnum和%DATATYP。他们似乎都没有工作。请帮忙!!

1 个答案:

答案 0 :(得分:2)

首先,您可以查看sashelp.vcolumn表来检查变量类型:

data want(keep=libname  memname name type);
    set sashelp.vcolumn( where= (libname='SASHELP' and memname='CLASS'));
run;

如果您不想使用vcolumn表,可以使用vtype()数据步骤功能@Tom建议:

data _NULL_;
    set  &input (obs=1);
    call symput('binary',ifc(vtype(&values)='N','YES','NO' ));
run;