首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS的意思是:如何在输出数据集中捕获非默认统计信息,如n想念、p1、p99等?

SAS的意思是:如何在输出数据集中捕获非默认统计信息,如n想念、p1、p99等?
EN

Stack Overflow用户
提问于 2013-06-07 14:51:44
回答 2查看 4.8K关注 0票数 4

原题:

默认情况下,Proc意味着在输出数据集中输出N、MIN、平均值、MAX和STD。如何将NMISS、P1、P5等添加到此列表中?

补充信息1:

我需要数据集中所有数值变量的统计信息。所以我在var规范中使用_numeric_

我不希望每个统计数据都列在一行和变量中。

代码语言:javascript
复制
 Obs _TYPE_ _FREQ_ _STAT_    var1   var2 var3 etc    
 1     0    84829  N      84826.00
 2     0    84829  MIN        0.00
 3     0    84829  MAX     5000.00
 4     0    84829  MEAN     151.22
 5     0    84829  STD     1989.47
 6     0    84829  NMISS       3
 7     0    84829  P1         2.00
 8     0    84839  P99     4999.00

我该怎么做?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-07 15:22:29

本文很好地讨论了您所描述的确切问题,以及输出适合您描述的数据集的宏代码。

一个更好的方法- ODS数据陷阱

更新:我发现最近有一篇文章“提供了支持附加特性的宏的修订版,并消除了一个令人惊讶的错误”。这是最新的解决方案:

用PROC方法解决SAS ODS数据陷阱

这个宏看起来设计得很好,避免了各种各样的可能问题。用于创建输出数据集的扭曲涉及对proc means (当然)、proc sqlproc contentsproc datasets的调用,以及宏语言体系结构的广泛使用,对它们的描述在这个答案中可能没有指导意义。我并不是说自己完全理解它。

但是,一旦编译了宏,就应该能够用一条简单的语句创建所需的数据集。

代码语言:javascript
复制
%better_means(data=MyDataSet)

现在我已经找到了这个方便的解决方案,我可以开始使用它了。

票数 3
EN

Stack Overflow用户

发布于 2013-06-07 14:54:54

假设您在proc中使用输出选项(而不是ODS输出),您可以控制数据集中的内容,如下所示:

代码语言:javascript
复制
proc means data=sashelp.class;
var age;
class sex;
output out=mymeans nmiss= P1= P5= /autoname;
run;

统计名称的完整列表可以在PROC是指文件中的"statistics关键字“下面找到。

您还可以实现与ODS输出相同的结果(输出格式略有不同)。

代码语言:javascript
复制
ods output summary=mymeans;
ods trace on;
proc means data=sashelp.class nmiss p1 p5;
var age;
class sex;
run;
ods trace off;
ods output close;

ODS跟踪/关闭是显示创建的表的名称(即‘汇总’)。它在生产中不需要。在本例中,您向输出窗口(在PROC表示语句中)请求统计数据的方式与请求它们的方式相同。

根据您的编辑,您希望它转置(每一统计数据一行)。你不能直接得到,但换位并不难。

代码语言:javascript
复制
proc means data=sashelp.class nmiss p1 p5;
class sex;
var _numeric_;
output out=mymeans n= mean= nmiss= p1= p5= /autoname ;
run;

data mymeans_out;
set mymeans(drop=_type_ _freq_);
by sex;
array numvars _numeric_;
format var stat $32.;
do _t = 1 to dim(numvars);
 var=scan(vname(numvars[_t]),1,'_');
 stat=scan(vname(numvars[_t]),-1,'_');
 value = numvars[_t];
 output;
end;
keep sex var stat value;
run;

这有一些限制。如果变量名中已经有下划线,则需要重写var=scan...行以使用substr并找到最后一个下划线,然后是var = substr(vname(...),1,position_of_last_underscore)。Stat应该是好的,因为它使用-1 (反向方向)。如果变量名可能超过~23个字符,则可能不会再次得到确切的变量名,因为它可能被截断或修改。如果是这样的话,那么上面的ODS输出解决方案将帮助您(因为它在额外的列中提供了原始变量的名称),但是需要做更多的工作才能将该值与截断的名称关联起来。

我还删除了_TYPE__FREQ_,以简化数组定义;如果需要这些定义,则需要编写一些代码来将它们从单独的输出中排除出来,并保留它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16987019

复制
相关文章

相似问题

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