【问题标题】:SAS Arrays within Macro宏中的 SAS 阵列
【发布时间】:2016-12-01 10:32:27
【问题描述】:

我尝试使用在循环中创建的散点图模板,以便捕获每个绘图组合,但我发现我不能对数组使用 call 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;

【问题讨论】:

  • 没有宏数组的概念。一个类比是一个列表,您依次访问每个项目,请参阅此处的示例support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/…
  • 您希望宏变量 TEMP 包含什么?源表 MYCSV 中有多少观察值?发布一个简单的 MYCSV 示例以及您想要生成的 SCATTERPLOT 语句?
  • 你好 Tom,我只为 1 个组合添加了散点图示例,我想为所有组合生成相同的(在本例中为 3 个组合)。我有 3 个数值参数和 900 个观察值。问候
  • @Reza,非常感谢。我通过使用您提供的链接解决了它
  • 我不明白你在说什么组合?您是在谈论三个变量 X、Y 和 Z 的 2 路组合吗? x=X y=Y, x=X y=Z, x=Y y=Z?

标签: arrays loops macros sas


【解决方案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;

【讨论】:

    【解决方案2】:
     %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();
    

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多