Sas 压制;频率“;PROC FREQ中的文本

Sas 压制;频率“;PROC FREQ中的文本,sas,output,Sas,Output,我怎样才能摆脱红色圆圈内的盒子 代码: 我知道的唯一方法是编辑PROC FREQ模板。从9.3左右开始,PROC FREQ已通过PROC TEMPLATE重写为一个基本表,这很好,因为它允许我们编辑它的几乎所有方面 我要做的是右键单击display manager中的结果树标题-如下所示: 然后选择“模板”。这将打开模板列表,其中包括您已安装的所有模板(样式模板和表格模板-大多数程序都有表格模板,但msot并没有像PROC FREQ那样提供更多的控制) 然后导航到Sashelp.Tmplms

我怎样才能摆脱红色圆圈内的盒子

代码:


我知道的唯一方法是编辑
PROC FREQ
模板。从9.3左右开始,
PROC FREQ
已通过
PROC TEMPLATE
重写为一个基本表,这很好,因为它允许我们编辑它的几乎所有方面

我要做的是右键单击display manager中的结果树标题-如下所示:

然后选择“模板”。这将打开模板列表,其中包括您已安装的所有模板(样式模板和表格模板-大多数程序都有表格模板,但msot并没有像
PROC FREQ
那样提供更多的控制)

然后导航到Sashelp.Tmplmst(这是大多数预安装模板的主要模板存储),打开Base,然后打开Freq。这将为您提供组成
PROC Freq
的表模板列表

在您的例子中,您希望打开CrossTabFreqs,这就是您正在生成的(交叉表)。您可以通过在上运行
ods trace来识别这一点然后运行代码;它将在日志中告诉您它使用的模板的名称

打开该窗口,将模板浏览器的内容复制到剪贴板,然后粘贴到新窗口中。我们将修改它,将其保存在临时位置,然后使用它

将以下内容添加到程序的顶部:

ods path work.templat(update) sashelp.tmplmst(read);
这告诉SAS两件事:第一,当我们更新或写入模板存储时,在
工作中执行这项操作;第二,首先在
work
中查找模板,然后在
sashelp
中查找模板。这样,当我们创建新的
CrossTabFreqs
模板时,它将来自
work

现在,在程序中查找定义
频率块的位置。这是您想要修改的内容,因为这是SAS的说明,告诉它在显示频率时打印什么(与百分比或诸如此类的内容相反)。内容如下:

  define Frequency;                                                       
     header = "Frequency";                                                
     format = BEST7.;                                                     
     label = "Frequency Count";                                           
     print;                                                               
     data_format_override;                                                
  end;    
您想删除
标题
。您可以通过以下两种方式之一实现:要么完全删除标题行,要么我的首选选项将其更改为

  define Frequency;                                                       
     header = " ";                                                
     format = BEST7.;                                                     
     label = "Frequency Count";                                           
     print;                                                               
     data_format_override;                                                
  end;    

然后运行整个程序(包括
ods path
语句)。现在,当您在此SAS会话中使用
PROC FREQ
时,频率表标题中将没有文本。

与SAS一样,有多条路径可到达所需的结果

data mydata;
input x y;
datalines;
    1 2
    3 4
    1 5
    3 2
;
run;

/*Write new template to work folder */
ods path work.templat(update) sashelp.tmplmst(read);

/*Remove the "Frequency" header from the template */
proc template;
  edit Base.Freq.CrossTabFreqs;
    edit frequency;
      header="";
    end;
  end;
run;

proc freq data=mydata;
    tables x*y /nopercent norow nocol;
run;
如果您愿意退出
proc freq
,可以使用
proc tablate
获得所需的输出。这提供了一个更简单(更简洁)的解决方案,并且不需要深入研究冗长且经常混淆的
proc模板
文档

proc tabulate data = mydata;
    /* Specify the variables to investigate */
    class x y; 
    table
        /* Put x in the rows suppress its title and add a total row */
        x = "" all = "Total", 
        /* Put y in the columns, request a total, request frequency count*/
        (y all = "Total") * n = "" / 
            /* Put "x" in the top left box */
            box = "x" 
            /* Put 0 instead of missing */
            misstext = "0"; 
run;

这是我的答案的一个稍微简单的版本,但是我会对编辑基本模板产生异议。不要。在工作中创建一个模板,这样就不会有弄乱永久模板的风险。如果您只需添加我建议的
ods path
语句,就可以这样做(这样您就不需要恢复代码,因为它会在您关闭SAS时消失)。好吧,我的代码不会弄乱sashelp.tmplmst中的永久模板,因为sashelp.tmplmst是只读的。我的代码在sasuser.templat中创建自定义模板。如果有的话,我应该删除自定义模板,而不是再次编辑它以匹配默认模板。我遗漏了什么吗?您假设用户在sasuser.templat中没有副本,但这并不一定安全。这就是为什么每当我做这样的事情(即,一个真正的临时模板)时,我都使用work,而不是sasuser。我不小心在sasuser中留下了一些东西,这些东西会在以后的会话中产生影响。谢谢!当我按照Joe的建议在开头添加ods path语句时,这个答案对我很有用。否则,它会给出“错误:模板'Base.Freq.CrossTabFreqs'无法写入模板存储!”。我不知道这是否是因为我打开了多个SAS系统,其中只有一个可以使用SASUSER@DWal也许你可以编辑Joe关于将模板保存到你的答案中的建议,这样人们就不必在评论中挖掘了。虽然你已经有了下面的几个答案,但我建议使用PROC tablate。您可以更好地控制输出,包括列/行标题和变量格式。您完全正确。这实际上非常有用,可能是最好的方法!谢谢,谢谢!这对我来说是完美的,很好的模板信息。遗憾的是,我不能接受所有的答案。但有一件事:对于我来说,当我浏览模板时,我无法从tmplmst中找到交叉表,而是在tmplbase中。我正在使用SAS 9.4。@Pekka这很有趣。我都有9.3。9.4和9.3就在那里;9.4与您看到的匹配。我不知道他们把它搬走了!
proc tabulate data = mydata;
    /* Specify the variables to investigate */
    class x y; 
    table
        /* Put x in the rows suppress its title and add a total row */
        x = "" all = "Total", 
        /* Put y in the columns, request a total, request frequency count*/
        (y all = "Total") * n = "" / 
            /* Put "x" in the top left box */
            box = "x" 
            /* Put 0 instead of missing */
            misstext = "0"; 
run;