2014-01-29 166 views
1

我有一個組宏變量,我想將其類放入宏變量中。例如:如何在宏變量中存儲變量的不同值

%macro test(group=); 
     proc freq data=foll; 
     tables &group/out=freqtbl; 
    run; 
    proc sql; 
     create table grp 
     (grpid char(4)); 
     insert into grp 
     values('a') 
     values('b') 
     ; 
    quit; 
    data freqtbl1; 
     merge grp freqtbl; 
    run; 
    data freqtbl2; 
     set freqtbl1; 
     call symput(grpid,&group); 
    run; * &a is the first group, &b is the second group; 
%mend; 

這適用於2個類,但如果它有3個或多於3個類,該怎麼辦?

非常感謝。

+0

什麼是這方面的一個「類」列中的數據集? – Joe

+0

sex = f/m,status = y/n等 – Autumn

+0

所以你想創建包含變量唯一值的宏變量? – Joe

回答

2

該宏將爲數據集的列中的每個不同觀察值創建一個宏變量。

瓦爾=你想爲

數據集一組宏觀變量的列=你在

%macro var_for_val(dataset=,var=); 

    proc sql noprint; 

     create table dist_var as 
     select distinct &var. 
     from &dataset. 
     ; 
    quit; 

    proc sql noprint; 

     create table dist_Var2 as 
     select monotonic() as id, &var. 
     from dist_var 
     ; 
    quit; 

    proc sql noprint; 

     select distinct max(id) 
     into :max_var 
     from dist_var2 
     ; 
    quit; 

    %do i = 1 %to &max_var.; 
     %global var_&i.; 
     proc sql noprint; 

      select distinct &var. 
      into :var_&i. 
      from dist_var2 
      where id = &i. 
      ; 
     quit; 
     %put &&var_&i.; 
    %end; 
%mend; 
%var_for_val(sashelp.class,var=age); 

%put &var_1.; 
+0

這在宏觀上很棒。謝謝!希望我能標出兩個正確的聲音。 – Autumn

+0

@Autumn您可以在任何一種情況下或兩種情況下都提示您發現它是一個有用的答案(綠色向上箭頭)。 – Joe

3
proc sql; 
select distinct age into :cls1-:cls10 
from sashelp.class; 
quit; 

%put &cls1 &cls2 &cls3 &cls4 &cls5 &cls6 &cls7; 

你們還是要知道什麼時候該使用時(如上面的,&cls7沒有解決)停止的問題。將-:cls10或其他任何值設置爲足夠高的值,而不會耗盡變量。

如果你真的希望這是一個變量,

select distinct age into :cls separated by ' ' 

將使& CLS具有所有值的吧。

你也可以做到這一點在數據步 - 是這樣的:

data _null_; 
set mydata; 
by myvar; 
initialvar=65; 
if first.myvar then do; 
    call symput(byte(initialvar),myvar); 
    initialvar+1; 
end; 
run; 

這就需要你有它排序。您可以交替地從PROC FREQ結果數據集中運行一組類似的代碼。

+0

雅這有助於很多。謝謝! – Autumn