【问题标题】:SAS: Write a macro...SAS:写一个宏...
【发布时间】:2017-08-03 14:10:18
【问题描述】:

我对 SAS 宏有疑问(我在 R 和 python 中进行分析,没有 SAS)。所以,这让我在解决以下问题时对 SAS 的语法缺乏了解。

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

我还需要使用数据集测试宏,使用 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")

提前致谢。

【问题讨论】:

  • 请解释一下什么是'bin'?
  • 直方图中的 bin 对应于条形。它们被称为垃圾箱,因为您想象有人根据您正在做直方图的任何属性将 [项目] 分类到垃圾箱中。
  • 没有。直方图中的 bin。它会自动将它们带到整数列表的大小。

标签: macros sas


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    首先,您真的应该自己尝试一下,让我们知道您遇到的问题。

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

    制作一些测试数据;

    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;
    

    产生这个:

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

    %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)' 生成相同的图像。

    让我们编写一些循环遍历 bin 值的东西并调用这个宏:

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

    【讨论】:

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