SAS:写一个宏......

时间:2017-08-03 14:10:19

标签: macros sas

我对SAS Macro有疑问(我在R和python中做分析,没有SAS)。因此,在解决以下问题时,我对SAS的语法缺乏了解。

编写一个接受表名,列名,整数列表,主轴标签和x轴标签的宏。此函数应扫描整数列表中的每个元素,并为每个整数值生成直方图,将bin计数设置为输入列表中的元素,并使用指定的参数标记main和x轴。您应该将y轴标记为Frequency,bin =和bin的数量。

此外,我需要使用数据集测试宏,使用bin号码12,36和60.所以,我可以用类似

的方式调用宏
%plot_histograms(data, y, 12 36 60, main="Title", xlabel="x_label");
to plot three different histograms of the data set.

提示:假设12 36 60解析为单个宏参数并使用%scan,宏定义可能看起来像

%macro plot_histograms(table_name, column_name, number_of_bins, main="Main", xlabel="X Label")

先谢谢。

2 个答案:

答案 0 :(得分:1)

首先,你真的应该自己尝试一下,让我们知道你被困在哪里。

那就是说,让我们分解如何解决这个问题。

制作一些测试数据;

data test;
do i=1 to 10000;
    r = rannor(1);
    output;
end;
run;

如何使用此方法创建直方图?使用PROC SGPLOT

proc sgplot data=test;
histogram r / nbins=10;
xaxis label="X LABEL";
yaxis label="Y LABEL";
run;

产生这个: enter image description here

所以,如果我创建一个宏来创建它:

%macro histogram(data,column,bin,xlabel,ylabel);
    proc sgplot data=&data;
    histogram &column / nbins=&bin;
    xaxis label="&xlabel";
    yaxis label="&ylabel";
    run;
%mend;

现在%histogram(test,r,10,X LABEL,Y LABEL)'生成相同的图像。

让我们写一些循环于二进制值的东西并调用这个宏:

%macro make_histograms(data,column,bins,xlabel,ylabel);
   %local i n bin;
   %let n=%sysfunc(countw(&bins)); /*Number of words in &bins*/
   %do i=1 %to &n;
      %let bin=%scan(&bins,&i);  /*Get the nth bin*/
      %histogram(&data,&column,&bin,&xlabel,&ylabel);
   %end;
%mend;

答案 1 :(得分:0)

我不完全理解您的问题,但这不是一个免费的代码平台,但这应该指向正确的方向

%macro plot_histograms(table_name, column_name, number_of_bins, main="Main", xlabel="X Label");
    %do i=1 %to %sysfunc(countw(&number_of_bins.); /* loop accross elements in your input list */
      proc gchart data=&table_name.; /*make a chart for the provided table */
          ...
          /* whatever it is you actually need to do, fetch the current element of the input list like this */
          %scan(&number_of_bins.,&i.)
          ...
      run;
    %end;
%mend;