2016-03-09 76 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