原题:
默认情况下,Proc意味着在输出数据集中输出N、MIN、平均值、MAX和STD。如何将NMISS、P1、P5等添加到此列表中?
补充信息1:
我需要数据集中所有数值变量的统计信息。所以我在var规范中使用_numeric_。
我不希望每个统计数据都列在一行和变量中。
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我该怎么做?
谢谢!
发布于 2013-06-07 15:22:29
本文很好地讨论了您所描述的确切问题,以及输出适合您描述的数据集的宏代码。
一个更好的方法- ODS数据陷阱
更新:我发现最近有一篇文章“提供了支持附加特性的宏的修订版,并消除了一个令人惊讶的错误”。这是最新的解决方案:
用PROC方法解决SAS ODS数据陷阱
这个宏看起来设计得很好,避免了各种各样的可能问题。用于创建输出数据集的扭曲涉及对proc means (当然)、proc sql、proc contents和proc datasets的调用,以及宏语言体系结构的广泛使用,对它们的描述在这个答案中可能没有指导意义。我并不是说自己完全理解它。
但是,一旦编译了宏,就应该能够用一条简单的语句创建所需的数据集。
%better_means(data=MyDataSet)现在我已经找到了这个方便的解决方案,我可以开始使用它了。
发布于 2013-06-07 14:54:54
假设您在proc中使用输出选项(而不是ODS输出),您可以控制数据集中的内容,如下所示:
proc means data=sashelp.class;
var age;
class sex;
output out=mymeans nmiss= P1= P5= /autoname;
run;统计名称的完整列表可以在PROC是指文件中的"statistics关键字“下面找到。
您还可以实现与ODS输出相同的结果(输出格式略有不同)。
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表示语句中)请求统计数据的方式与请求它们的方式相同。
根据您的编辑,您希望它转置(每一统计数据一行)。你不能直接得到,但换位并不难。
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_,以简化数组定义;如果需要这些定义,则需要编写一些代码来将它们从单独的输出中排除出来,并保留它们。
https://stackoverflow.com/questions/16987019
复制相似问题