2016-12-01 63 views
-1

ScatterplotSAS阵列内的宏

我尝试使用一个循环中我创建了一个散点图模板,这样我可以抓住每一个情节的组合,但我知道我不能使用呼叫symputX数组。我怎样才能找到这种情况下的转机?

上面你可以找到一个仅适用于一个组合的散点图示例。

,如果你想存储在宏变量值的列表,你应该只使用一个分隔的字符串谢谢

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

没有宏数组的概念。一个类比将是一个列表,并依次访问每个项目,请参阅此处的示例http://support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/default/viewer.htm#p1n2i0ewaj1zian1ria5579z1zjh.htm – Reeza

+0

你想要宏变量TEMP包含什么?源表MYCSV中有多少观察值?发布一个简单的MYCSV示例以及您想要生成的SCATTERPLOT语句? – Tom

+0

你好汤姆,我只为1个组合添加了散点图示例,我想为所有组合生成相同的(在这种情况下为3个组合)。我有3个数值参数和900个观测值。关于 –

回答

1

一般。如果列表是变量名,那么使用空格作为分隔符是最简单的。

%let varlist= X Y Z ; 

然后,您可以轻松构建宏逻辑来查找所有双向组合。

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