2016-10-26 4 views
0

Ich habe etwas Code von anderswo gestohlen, um alle Kombinationen von Variablen zu erstellen. Ich brauche das, um mehrere Regressionen zu erstellen und dann das Beste zu bestimmen. Ich mag die Ausgabe, da ich dann eine Zeile verwenden kann und alle Namen der Variablen an 1 Stelle haben.SAS Alle Kombinationen mit Makrovariable

Das Array funktioniert, wenn ich die Daten manuell eingeben, aber das muss über verschiedene Daten arbeiten und selbst die Variablen auswählen, so muss ich eine Makrovariable verwenden, um die Daten einzugeben. Dies sollte kein Problem sein, dies funktioniert mit anderen Datensätzen. Kann mir jemand sagen, wo ich falsch liege?

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; 

Dieses nächste Element funktioniert nicht. Gibt mir nur fehlende Werte - aber es weiß, es braucht 127 ... Subs ist nur eine Makrovariable mit new1-new7 drin.

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; 

Ihre Hilfe wird sehr geschätzt.
J

Antwort

1

Wenn Sie U-Boote als

%let subs=new1-new7; 

Dann denkt SAS diese Variablen definiert haben, nicht String-Werte. Wenn Sie diese keep=-Anweisung löschen, sehen Sie, dass SAS Variablen new1-new7 erstellt hat.

Sie müssen es in dem Format aus dem ersten Beispiel beibehalten. Versuchen Sie folgendes:

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

Wenn Sie das Formular, das Sie hatten verwenden wollen, dann müssen Sie den Namen der Variablen in dem Array lesen und verwenden. Hier erstelle ich ein neues Array von Strings, um die Namen zu halten. Sie können nur den Wert von n ändern und sehen dies für alle Werte arbeiten (bis Sie in my_string der Platz nicht ausreicht, die ich in der Größe upped):

%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

Sorry für die Zeitverschwendung. Die Antwort war, dass mein Array keine Sprachmarkierungen hatte, also musste ich es mit den Sprachmarkierungen im Array neu erstellen. Dann funktioniert es wie ein Zauber.

Wobei anz die Nummer im Makro ist.

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; 
Verwandte Themen