Printing 如何输出SAS IML值以进行打印

Printing 如何输出SAS IML值以进行打印,printing,sas,Printing,Sas,我想获取在IML中计算的值,以便在SAS的打印功能%PRNTINIT中使用。此功能用于从数据库中提供每周报告,以便进行更新 我有一些遗留代码,使用proc sql声明稍后调用的宏类型值,例如: 声明变量:tot1-tot4 调用变量tot1-tot4进行打印 如果可能的话,我希望能够从IML调用类似的值 示例数据: data test ; input age type gender $; cards; 1 1 m 1 1 m 1 1 m 1 1 f 1 1 f 1 2 f 2 1 m 2

我想获取在IML中计算的值,以便在SAS的打印功能%PRNTINIT中使用。此功能用于从数据库中提供每周报告,以便进行更新

我有一些遗留代码,使用
proc sql
声明稍后调用的宏类型值,例如:

声明变量:tot1-tot4 调用变量tot1-tot4进行打印 如果可能的话,我希望能够从IML调用类似的值


示例数据:

data test ;
input age  type  gender $;
cards;
1 1 m
1 1 m
1 1 m
1 1 f
1 1 f
1 2 f
2 1 m
2 1 f
2 2 m
2 2 m
2 2 m
2 2 m
2 2 m
2 2 f
2 2 f
2 2 f
;




proc freq data = test;
tables type*age /  chisq norow nocol nopercent outexpect out=out1 ;
tables type*gender / chisq norow nocol nopercent outexpect out=out2 ;
run;


options missing=" ";

proc iml;

reset print; 

use out2;
read all var {count} into count;

type1 = count[1:2] ;
type2 = count[3:4] ;

tab = type1 || type2 ;

cols = tab[+,] ;
rows = tab[,+] ;
tot  = sum(tab) ;

perc = round(cols / tot, .01) ;

cell_perc = round(tab / (cols//cols) , .01) ;


expect = (rows * cols) / tot ;
chi_1 = sum((tab - expect)##2/expect) ;
p_chi_1 = 1-CDF('CHISQUARE',chi_1, ((ncol(tab)-1)*(nrow(tab)-1)));



print tab p_chi_1 perc cell_perc;



out_sex = tab || (. // p_chi_1);

print out_sex;

print out_sex[colname={"1","2"} 
              rowname={"f" "m" "p-value"}
              label="Table of Type by Gender"];




call symput(t1_sum, cols[1,1]) ;

%let t2_sum = put(cols[1,2]) ;
%let t1_per = perc[1,1] ;
%let t2_per = perc[1,2] ; 



%let t1_f = tab[1,1] ;
%let t1_m = tab[2,1] ;
%let t2_f = tab[1,2] ;
%let t2_m = tab[2,2] ;

%let t1_f_p = cell_perc[1,1] ;
%let t1_m_p = cell_perc[2,1] ;
%let t2_f_p = cell_perc[1,2] ;
%let t2_m_p = cell_perc[2,2] ;



%let p_val = p_chi_1 ;


*****  is it possible to list output values here for use in table building ???   ;
*  like:    %let t1_f = tab[1,1]
            %let t2_f = tab[2,1]   etc...  ;

quit;

因此,我想声明如下打印语句:

%print( "(N=&tab[1,1], column = 1, just=center, lines = bottom:none);
%print( "(N=&tab[1,2], column = 2, just=center, lines = bottom:none);
etc...
非常感谢您在这方面的任何帮助


更新:无法从IML中提取声明的宏值 我已经能够计算出正确的值并成功地格式化表格

但是,我无法提取打印宏中使用的值

我在IML中创建了一些矩阵和计算值,但当我试图声明宏变量以供以后使用时,返回的唯一内容是我声明变量为的文本值。。。e、 g:

你可以在表中看到我想要的数字,但到目前为止还没有成功。我尝试过使用
%let
put
symput
symputx
,但没有成功

call symput(t1_sum, cols[1,1]) ;

%let t2_sum = put(cols[1,2]) ;
%let t1_per = perc[1,1] ;
%let t2_per = perc[1,2] ; 



%let t1_f = tab[1,1] ;
%let t1_m = tab[2,1] ;
%let t2_f = tab[1,2] ;
%let t2_m = tab[2,2] ;

%let t1_f_p = cell_perc[1,1] ;
%let t1_m_p = cell_perc[2,1] ;
%let t2_f_p = cell_perc[1,2] ;
%let t2_m_p = cell_perc[2,2] ;

Blerg…

SAS/IML矩阵必须全部为数字或全部为字符,这就是您的尝试失败的原因。但是,SAS/IML PRINT语句有几个选项,可用于标记列和行以及应用格式。看见 与global SAS OPTIONS语句一起,我认为您可以获得所需的输出

1) 使用全局语句

options missing=" ";
告诉SAS将缺少的值打印为空白

2) 您的目标是在2x2选项卡矩阵中附加一列。对于没有数据的行,可以使用(数字)缺失值:

   out_age = tab || (. // p_chi_1);
3) 现在可以打印此2x3表,并使用COLNAME=和ROWNAME=选项显示行标题:

print out_age[rowname={"1","2"} 
              colname={"f" "m" "p-value"}
              label="Table of Type by Gender"];

如果您真的想使用旧式宏,可以使用SYMPUTX语句将SAS/IML中的值复制到宏变量中,如本文所示:

经过大量搜索,并找到一些帮助,我能够将答案拼凑在一起

  • 输出值必须是字符串
  • 宏变量的名称必须用引号括起来
  • 调用必须是
    symputx
    ,以便修剪额外的空白(与
    symput
    相比)

  • 将IML值提取到宏变量的代码
    用于使用旧SAS%PRNTINIT宏生成表的部分代码
    预期结果:


    你到底想在这里完成什么?%PRINT不是SAS中的内置宏,因此您使用的是一些自定义宏(可能是这一个?;如果是这样的话,那篇论文是在1996年写的(!!),而且已经过时,与此无关)。现在你会用ODS来做你建议的事情。您要查找的输出究竟是什么样子的?这是文本文件、PDF、RTF/Word文件、HTML吗?@Joe同意这是一项非常古老的技术,您提到的网站是我唯一能找到它的参考资料的地方。目标是生成一个RTF文件,我们可以将其编译成一份周报。然而,所有需要的表格都是由研究团队“勾勒出来的”(类似于网站上的图5)。因此,我们使用
    %print
    功能按指定构建表。它相当乏味,但很稳定。我当然愿意接受其他建议。在没有看到“草图”的情况下,我不能具体地说什么,但一般来说,通过ODS RTF和PROC报告或打印,或者ODS文本,你应该能够提出任何合理的建议[或者至少足够接近研究人员通常认为是可以的],或过程模板和一个FREQ/tablate/etc.PROC。这是一个很好的起点——它有一个很好的PROC模板示例,可以让您的颜色和表格格式正确,并且具有很大的灵活性。我想,一旦你学会了,就应该少很多乏味的东西。我已经尝试了你的建议,但我仍然对如何从IML中获得数字感到困惑。我已经用我迄今为止尝试过的方法更新了上面的代码,但是没有用。正如你所看到的,我已经让print宏运行良好,只需要填写数字…按照博客文章中的说明使用SYMPUTX,而不是%LET。例如,调用symputx(“t1_sum”,cols[1,1]);
       out_age = tab || (. // p_chi_1);
    
    print out_age[rowname={"1","2"} 
                  colname={"f" "m" "p-value"}
                  label="Table of Type by Gender"];
    
    call symputx('t1_sum', char(cols[1,1])) ;
    call symputx('t2_sum', char(cols[1,2])) ;
    
    call symputx('t1_per', char(perc[1,1])) ;
    call symputx('t2_per', char(perc[1,2])) ;
    
    call symputx('t1_f' , char(tab[1,1])) ;
    call symputx('t1_m' , char(tab[2,1])) ;
    call symputx('t2_f' , char(tab[1,2])) ;
    call symputx('t2_m' , char(tab[2,2])) ;
    
    call symputx('t1_f_p' , char(cell_perc[1,1])) ;
    call symputx('t1_m_p' , char(cell_perc[2,1])) ;
    call symputx('t2_f_p' , char(cell_perc[1,2])) ;
    call symputx('t2_m_p' , char(cell_perc[2,2])) ;
    
    call symputx('p_val' , char(round(p_chi_1, .001))) ;
    
    ...
    %print("Female",            column = 1,  just = center  );
    %print("&t1_f (&t1_f_p)",   column = 2,  just = center  );
    %print("&t2_f (&t2_f_p)",   column = 3,  just = center  );
    %print(,                    column = 4,  just = center  );
    %print(proc = newrow);
    
    %print("Male",              column = 1,  just = center  );
    %print("&t1_m (&t1_m_p)",   column = 2,  just = center  );
    %print("&t2_m (&t2_m_p)",   column = 3,  just = center  );
    %print("&p_val",            column = 4,  just = center  );
    ...