2016-12-01 4 views
-1

ScatterplotSAS Arrays innerhalb Macro

ich versuche, eine Scatterplot Vorlage zu verwenden ich innerhalb einer Schleife erstellt, so dass ich alle Plot Kombinationen zu fangen, aber ich sehe, dass ich nicht symputX für Arrays verwenden Anruf. Wie kann ich für solche Fälle einen Turnaround finden?

Oben finden Sie eines der Scatterplot-Beispiele für nur eine Kombination.

Danke

data work.mycsv; 
    set work.mycsv; 
    array temp[3] x y z; 
    call symputX('temp',temp); 
    run; 
    %macro scatter(); 
    %let i = 1; 
    %do %while (&i <= 3); 
    %let j = %sysevalf(&i+1); 
    %do %while(&j <= 3); 
    %if &i ne &j %then %do; 
     proc template; 
     define statgraph scatterplot; 
      begingraph; 
       entrytitle "Title"; 
        layout overlay;  
         scatterplot x=&&temp[&i.] y=&&temp[&j.]/
         group=Survived name="scatter" datalabel=Response; 
         discretelegend "scatter"; 
        endlayout; 
      endgraph; 
     end; 
    %end; 
%let j =%sysevalf(&j + 1); 
%end; 
%let i = %sysevalf(&i + 1); 
%end; 
%mend scatter; 
%scatter(); 
proc sgrender data=work.mycsv template=scatterplot; 
run; 
+1

Es gibt kein Konzept für ein Makro-Array. Eine Analogie wäre eine Liste und Sie greifen nacheinander auf jedes Element zu, siehe das Beispiel http://support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/default/viewer.htm#p1n2i0ewaj1zian1ria5579z1zjh.htm – Reeza

+0

Was soll die Makrovariable TEMP enthalten? Wie viele Beobachtungen befinden sich in der Quelltabelle MYCSV? Veröffentlichen Sie ein einfaches Beispiel für MYCSV und die daraus resultierenden SCATTERPLOT-Anweisungen, die Sie generieren möchten. – Tom

+0

Hallo Tom, ich habe das Scatterplot-Beispiel für nur 1 Kombination hinzugefügt, ich möchte das selbe für alle Kombinationen erzeugen, (in diesem Fall 3 Kombinationen). Ich habe 3 numerische Parameter und 900 Beobachtungen.Regards –

Antwort

1

Normalerweise, wenn Sie sollten Sie nur eine begrenzte Zeichenfolge verwenden, um eine Liste von Werten in Makrovariablen speichern möchten. Wenn die Liste Variablennamen enthält, ist es am einfachsten, Leerzeichen als Trennzeichen zu verwenden.

%let varlist= X Y Z ; 

Dann könnte man leicht Makro Logik konstruieren alle zwei Wege-Kombinationen zu finden.

%let nitems=%sysfunc(countw(&varlist)); 
%do i=1 %to %eval(&nitems-1); 
    %let var1=%scan(&varlist,&i); 
    %do j=%eval(&i+1) %to &nitems ; 
    %let var2=%scan(&varlist,&j); 
    .... 
    %end; 
%end; 
0
%macro scatter(); 
%let varlist = x y z; 
%let i = 1; 
%do %while (&i <= 3); 
%let j = %sysevalf(&i+1); 
%do %while(&j <= 3); 
%if &i ne &j %then %do; 
    %let x_used=%qscan(%bquote(&varlist),&i); 
    %let y_used=%qscan(%bquote(&varlist),&j); 
    proc template; 
     define statgraph scatterplot; 
      begingraph; 
       entrytitle "&x_used and &y_used by Response"; 
        layout overlay;  
         scatterplot x=&x_used y=&y_used/
         group=Survived name="scatter" datalabel=Response; 
         discretelegend "scatter"; 
        endlayout; 
      endgraph; 
      end; 
      proc sgrender data=work.mycsv template=scatterplot; 
    run; 
    %end; 
%let j =%sysevalf(&j + 1); 
%end; 
%let i = %sysevalf(&i + 1); 
%end; 
%mend scatter; 
%scatter();