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;