2016-03-09 75 views
1

我想总结一下使用PROC SQL和PROC频率程序宏我的变量变量类型。检查在SAS-宏

下面是代码:

%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; 

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

我想的1的%在通过段的每个段(因此PROC FREQ)所有不同变量的二元变量(因此PROC SQL)和%。

我的第一个if语句检查是否变量,如果数字或没有,然后,如果它的数字,接下来的几个步骤是检查是否其二进制与否。如果它的二进制接着执行proc sql else execute proc freq。

如果变量是字符然后就执行PROC频率。

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

+1

%DATATYP是SAS提供的自动调用宏(也许%ISNUM也)。你确定你已经分配了自动唤醒库吗? –

+1

变量名称的%DATATYPE始终为字符,因为变量名称必须以字母开头。记住宏代码对字符串进行操作。 – Tom

+0

我建议先使用sashelp.vcolumn分隔数字和字符变量,然后向前移动处理以检查二进制与序数/名义。这听起来像一个自动化的数据挖掘解决方案 - 我很确定我已经在Lexjansen.com上看到了这个示例代码。你可能想看看一些预先写好的宏的想法。 – Reeza

回答

2

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

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

如果你不想使用VCOLUMN表,你可以使用vtype()数据阶跃函数@汤姆建议:

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

在数据步骤中使用'VTYPE()'函数来查找现有变量的类型。在宏的值上使用'%DATATYPE()'将不起作用。一个字符变量的值可以是'0',它看起来像是'%DATATYPE()'的一个数字。 – Tom

+0

你说得对,谢谢。 – Bagin