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

Zen*_*ega 4 sas

原问题:

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


附加信息1:

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

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

 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
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

谢谢!

Joe*_*Joe 5

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

proc means data=sashelp.class;
var age;
class sex;
output out=mymeans nmiss= P1= P5= /autoname;
run;
Run Code Online (Sandbox Code Playgroud)

统计名称的完整列表可在PROC MEANS 文档的“统计关键字”下找到。

您还可以使用 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;
Run Code Online (Sandbox Code Playgroud)

ODS TRACE on/off 用于显示创建的表的名称(即“摘要”)。生产中不需要它。在这种情况下,您要求统计数据的方式与要求输出窗口(在 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;
Run Code Online (Sandbox Code Playgroud)

这有一些限制。如果变量名中已经包含下划线,则var=scan...需要重写该行以使用 substr 并找到最后一个下划线,然后var = substr(vname(...),1,position_of_last_underscore). Stat 应该没问题,因为它使用 -1(反向)。如果您的变量名称可能超过约 23 个字符,您可能无法再次获得确切的变量名称,因为它可能会被截断或修改。如果是这种情况,那么上面的 ODS OUTPUT 解决方案将为您提供帮助(因为它在附加列中提供原始变量的名称),但需要做更多的工作才能将该值与截断的名称相关联。

我还删除了_TYPE__FREQ_, 以简化数组定义;如果您需要这些,那么您需要编写一些代码来将它们排除在单独输出之外,并保留它们。