2016-10-26 102 views
0

我從別處竊取了一些代碼以創建所有變量組合。我需要這個來創建多個迴歸,然後確定最佳。我喜歡輸出,因爲我可以使用一行,並將變量的所有名稱放在一個地方。SAS與宏變量的所有組合

當我手動輸入數據時,數組工作,但這需要跨不同的數據和自我選擇變量,所以我需要使用宏變量輸入數據。這不應該是一個問題,這與其他datasteps一起工作。有人可以告訴我我要去哪裏嗎?

data test(keep=my_string); 
length my_string $200.; 
    array a[4] $ ('new1' 'new2' 'new3' 'new4'); 

    n = dim(a); 

    do k=1 to n; 
     do j=1 to comb(n,k); 
      call allcomb(j,k,of a[*]); 
       do i = 1 to k; 
        if i=1 then do; my_string="";counter=0;end; 
        counter=counter+1; 
        my_string=catx(" ",my_string, a[i]); 
       if counter=k then output; 

       end; 
      end; 
    end; 
run; 

這下一個元素不起作用。只是給了我缺少的值 - 但它知道它需要127 ... subs只是一個宏變量,其中new1-new7。

rsubmit; 
data xx(keep=my_string); 
length my_string $200.; 
    array a &subs; 

    n = dim(a); 

    do k=1 to n; 
     do j=1 to comb(n,k); 
      call allcomb(j,k,of a[*]); 
       do i = 1 to k; 
        if i=1 then do; my_string="";counter=0;end; 
        counter=counter+1; 
        my_string=catx(" ",my_string, a[i]); 
       if counter=k then output; 

       end; 
      end; 
    end; 
run; 
endrsubmit; 

您的幫助非常感謝。
Ĵ

回答

1

如果定義爲潛艇

%let subs=new1-new7; 

然後SAS認爲這些變量,而不是字符串值。如果您刪除keep=聲明,您將看到SAS創建變量new1-new7

您需要將它保留在第一個示例的格式中。試試這個:

%let subs='new1' 'new2' 'new3' 'new4' 'new5' 'new6' 'new7'; 
%let n=7; 
data xx(keep=my_string); 
length my_string $200.; 
    array a[&n] $ (&subs); 

    n = dim(a); 

    do k=1 to n; 
     do j=1 to comb(n,k); 
      call allcomb(j,k,of a[*]); 
       do i = 1 to k; 
        if i=1 then do; my_string="";counter=0;end; 
        counter=counter+1; 
        my_string=catx(" ",my_string, a[i]); 
       if counter=k then output; 

       end; 
      end; 
    end; 
run; 

如果你想使用你有的表單,那麼你必須讀取數組中的變量名稱並使用它。在這裏,我正在創建一個新的字符串數組來保存名稱。你可以改變的n值,看看這會爲所有值工作(直到你my_string運行的空間,我在尺寸調升):

%let n=7; 
%let subs=new1-new&n; 

data xx(keep=my_string); 
length my_string $1000.; 
    array v &subs; 
    array a[&n] $32. _temporary_; 

    n = dim(v); 

    do i=1 to n; 
    a[i] = vname(v[i]); 
    end; 

    do k=1 to n; 
     do j=1 to comb(n,k); 
      call allcomb(j,k,of a[*]); 
       do i = 1 to k; 
        if i=1 then do; my_string="";counter=0;end; 
        counter=counter+1; 
        my_string=catx(" ",my_string, a[i]); 
       if counter=k then output; 

       end; 
      end; 
    end; 
run; 
0

對不起任何時間的浪費。答案是我的數組沒有語音標記,所以我不得不用數組中的語音標記重新創建它。然後它就像一個魅力。

其中anz是宏中的數字。

rsubmit; 
data hasitreallyworked; 
length my_string $200.; 
    array a[&anz] $ (&subs2); 

    n = dim(a); 

    do k=1 to n; 
     do j=1 to comb(n,k); 
      call allcomb(j,k,of a[*]); 
       do i = 1 to k; 
        if i=1 then do; my_string="";counter=0;end; 
        counter=counter+1; 
        my_string=catx(" ",my_string, a[i]); 
       if counter=k then output; 

       end; 
      end; 
    end; 
run; 
endrsubmit;