首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用宏生成图参数SAS

使用宏生成图参数SAS
EN

Stack Overflow用户
提问于 2014-06-17 13:57:02
回答 2查看 65关注 0票数 1

我正在尝试使用SAS宏自动化一个图形处理过程。由于这将用于几个不同的子集,因此必须相应地调整图形的轴。我尝试了几种不同的方法,觉得自己走错了方向。

这是我的数据集。

代码语言:javascript
复制
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)。

以下是我的最新尝试:

代码语言:javascript
复制
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 ;

任何帮助都将不胜感激。即使这意味着一种完全不同的方法(尽管我也想知道我在哪里出了问题)。

谢谢你,皮尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-17 16:21:21

你所做的是--写一个宏而不写一个宏。编写宏,这就更容易了。另外,如果您要让in始终为1/10,将其放入let语句中(尽管它们的概念可能有所不同,那么将它们作为参数保留)。

代码语言:javascript
复制
%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调用以获取这些参数到宏调用本身。

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

这使您可以生成多个调用,例如,如果您希望按某个变量进行分组(每个变量值有一个图)。

票数 1
EN

Stack Overflow用户

发布于 2014-06-17 14:36:06

sql中的2件事:您不能使用正在创建的宏,您只需要一个值,在执行max(B,C)时,您创建的值与dataset中的obs一样多,您需要另一个max。我不能检查sas图部件,因为我没有它,但是

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24265760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档