4

原始问题:

默认情况下,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

我该怎么做呢?

谢谢!

4

2 回答 2

4

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

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

统计名称的完整列表可在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;

ODS TRACE on/off 是显示创建的表的名称(即'summary')。生产中不需要它。在这种情况下,您要求统计信息的方式与向输出窗口要求统计信息的方式相同(在 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_and _FREQ_,以简化数组定义;如果你需要这些,那么你需要编写一些代码来将它们排除在单独的输出之外,并保留它们。

于 2013-06-07T14:54:54.673 回答
3

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

更好的方法——ODS 数据陷阱

更新:我发现最近有一篇论文“介绍了支持附加功能并消除了令人惊讶的错误的宏的修订版本”。这是更新的解决方案:

解决 PR​​OC MEANS 中的 SAS® ODS 数据陷阱

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

然而,一旦你编译了宏,你应该能够用一个简单的语句来创建你想要的数据集。

%better_means(data=MyDataSet)

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

于 2013-06-07T15:22:29.903 回答