SAS Proc意味着:如何捕获输出数据集中的非默认统计信息,例如nmiss p1 p99等?

时间:2013-06-07 14:51:45

标签: sas

原始问题:

默认情况下,Proc表示在输出数据集中输出N,MIN,MEAN,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

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:4)

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

proc means data=sashelp.class;
var age;
class sex;
output out=mymeans nmiss= P1= P5= /autoname;
run;

“统计信息关键字”下的PROC MEANS documentation中提供了完整的统计信息名称列表。

您还可以使用ODS OUTPUT获得相同的结果(输出格式略有不同)。

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 TRACE开/关是显示创建的表的名称(即“摘要”)。在生产中不需要它。在这种情况下,您要求统计信息的方式与您在输出窗口中要求的方式相同(在PROC MEANS语句中)。

根据您的修改,您希望转置(每个统计信息一行)。你不能直接得到它,但转换不是很难。

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 OUTPUT解决方案将帮助您(因为它在附加列中提供了原始变量的名称),但是需要更多的工作来将该值与截断的名称相关联。

我也放弃_TYPE__FREQ_,以简化数组定义;如果你需要那些,那么你需要编写一些代码来排除它们单独输出,并保留它们。

答案 1 :(得分:3)

本文对您描述的确切问题以及输出适合您描述的数据集的宏代码进行了精彩的讨论。

A Better Means — The ODS Data Trap

更新: 我发现有一篇更新的论文“提供了宏的修订版本,支持其他功能并消除了一个令人惊讶的错误。”这是更新的解决方案:

Solve the SAS® ODS Data Trap in PROC MEANS

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

但是,一旦编译了宏,您就可以使用一个简单的语句创建所需的数据集。

%better_means(data=MyDataSet)

现在我找到了这个方便的解决方案,我可能会开始自己使用它。