【问题标题】:Using Macros to generate graph parameters SAS使用宏生成图形参数 SAS
【发布时间】:2014-06-18 00:21:21
【问题描述】:

我正在尝试使用 SAS 宏自动执行图形处理。由于这将用于几个不同的子集,因此必须相应地调整图表的轴。我尝试了几种不同的方法,但我觉得我在兔子洞里走错了路。

这是我的数据集。

data want;
    input A B C D;
cards;
100 5   6   1
200 5   5   2
150 5.5 5.5 3
457 4.2 6.2 4
500 3.7 7.0 5
525 3.5 7.2 6
;
run;

我想要的是具有以下轴规格的图表: x 轴从 min(D) 到 max(D) 增加了一些合理的增量 左轴从 min(A) 到 max(A) 右轴从 min (B,C) 到 max(B,C)

这是我最近的尝试:

proc sql;
    select  roundz((max(A)+100), 100),
        roundz(min(A), 100),
        (&maxA.-&minA.)/10,
        roundz(max(B, C)+1, 1),
        roundz(min(B, C), 1), 
        (&maxBC.-&minBC.)/10, 
        roundz(max(D), 1), 
        roundz(min(D), 1),
        (&maxD.-&minD.+1)/3
        into :maxA, :minA, :Ainc,
            :maxBC, :minBC, :BCinc,
            :maxD, :minD, :Dinc
    from want;
run;


goptions reset=all ftext=SWISS htext=2.5 ;
axis1 order=(&minA to &maxA by &Ainc) minor=none label=(angle=90 'A label' ) offset=(1) ;
axis2 order=(&minBC to &maxBC by &BCinc) minor=(number=1) label=(angle=90 'BC Label') offset=(1);
axis3 order=(&minD to &maxD by &Dinc) minor=(number=2) label=('D') offset=(1) ;
symbol1 color=black i=join value=circle height=2 width=2 ;
symbol2 color=black i=join value=square height=2 width=2 ;
symbol3 color=black i=join value=triangle height=2 width=2 ;
legend1 label=none mode=reserve position=(top center outside) value=('Label here' ) shape=symbol(5,1) ;
legend2 label=none mode=reserve position=(top center outside) value=('label 1' 'label 2') shape=symbol(3,1) ;


proc gplot data=want;
    plot A*D=1 /overlay legend=legend1 vaxis=axis1 haxis=axis3 ;
    plot2 B*D=2 &var_C*D=3 /overlay legend=legend2 vaxis=axis2 ;
run ;

任何帮助将不胜感激。即使这意味着一种完全不同的方式(尽管我也很想看看我在哪里出错了)。

谢谢,皮尔

【问题讨论】:

    标签: graph sas


    【解决方案1】:

    你正在做的就是写一个宏而不写一个宏。编写宏,这更容易。此外,如果您要让 INC 始终为 1/10,请将其放在 let 语句中(尽管如果它们的概念可能不同,则将它们作为参数保留)。

    %macro graph_me(minA=,maxA=, minBC=,maxBC=, minD=, maxD=);
     %let incA = %sysevalf((&maxA.-&minA.)/10); *same for incD and incBC;
     goptions reset=all ftext=SWISS htext=2.5 ;
     axis1 order=(&minA to &maxA by &incA) minor=none label=(angle=90 'A label' ) offset=(1) ;
     axis2 order=(&minBC to &maxBC by &incBC) minor=(number=1) label=(angle=90 'BC Label')  offset=(1); 
     axis3 order=(&minD to &maxD by &incD) minor=(number=2) label=('D') offset=(1) ;
     symbol1 color=black i=join value=circle height=2 width=2 ;
     symbol2 color=black i=join value=square height=2 width=2 ;
     symbol3 color=black i=join value=triangle height=2 width=2 ;
     legend1 label=none mode=reserve position=(top center outside) value=('Label here' )  shape=symbol(5,1) ; 
     legend2 label=none mode=reserve position=(top center outside) value=('label 1' 'label 2') shape=symbol(3,1) ;
    %mend graph_me;
    

    现在编写您的 SQL 调用以将这些参数获取到宏调用本身。

    proc sql NOPRINT;
        select 
            cats('%graph_me(minA=',roundz(min(A), 100),
            ',maxA=', roundz((max(A)+100), 100),        
            ... etc. ...
           into :mcall
        from want;
    quit;
    

    这为您提供了一个优势,例如,如果您希望按某个变量分组(每个变量值有一个图表),您可以生成多个调用。

    【讨论】:

      【解决方案2】:

      sql 中的两件事: 你不能使用你正在创建的宏,你只需要一个值,当你做max(B,C)时,你创建的值与数据集中的obs一样多,你需要另一个max。 我无法检查 sas 图部分,因为我没有它,但是

      proc sql NOPRINT;
          select  roundz((max(A)+100), 100)  as maxA,
              roundz(min(A), 100) as minA,
              ((calculated maxA)-(calculated minA))/10,
              roundz(max(max(B, C))+1, 1) as maxBC,
              roundz(min(min(B, C)), 1) as minBC,
              ((calculated maxBC)-(calculated minBC))/10, 
              roundz(max(D), 1) as maxD, 
              roundz(min(D), 1) as minD,
              ((calculated maxD)-(calculated minD)+1)/3
              into :maxA, :minA, :Ainc,
                  :maxBC, :minBC, :BCinc,
                  :maxD, :minD, :Dinc
          from want;
      quit;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2016-02-05
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        相关资源
        最近更新 更多