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

SAS Proc意味着:如何在输出数据集中捕获非默认统计信息,如nmiss p1 p99等?,sas,Sas,原始问题: 默认情况下,Proc表示输出数据集中的N、MIN、MEAN、MAX和STD。如何将NMISS、P1、P5等添加到此列表中 附加信息1: 我想要数据集中所有数值变量的统计信息。因此,我在var规范中使用了\u numeric\ 我不希望每个统计数据都列在一行中,每个变量都列在一列中 Obs _TYPE_ _FREQ_ _STAT_ var1 var2 var3 etc 1 0 84829 N 84826.00 2 0 8

原始问题:

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


附加信息1:

我想要数据集中所有数值变量的统计信息。因此,我在var规范中使用了
\u 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
我该怎么做


谢谢

假设您正在使用proc means中的输出选项(而不是ODS输出),您可以像这样控制数据集中的内容:

proc means data=sashelp.class;
var age;
class sex;
output out=mymeans nmiss= P1= P5= /autoname;
run;
统计名称的完整列表可在“统计关键字”下的中找到

您还可以通过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 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,位置为最后一个下划线)
。Stat应该很好,因为它使用-1(反向)。如果变量名可能超过23个字符,则可能无法重新获取确切的变量名,因为它可能会被截断或修改。如果是这种情况,那么上面的ODS输出解决方案将对您有所帮助(因为它在另一列中提供了原始变量的名称),但是需要更多的工作来将该值与截断的名称关联起来


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

这篇文章对您描述的确切问题进行了极好的讨论,以及输出符合您描述的数据集的宏代码

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

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

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

%better_means(data=MyDataSet)

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

嗨,谢谢你的回复。我已经在我的问题中添加了其他信息。已修改以反映该附加请求。非常感谢您提供的解决方案。我真的很感激。但是我的数据集还需要其他解决方案中的论文提供的东西。这是一篇非常好的论文(我发现这篇论文有时很有用),但我不喜欢只链接的答案。最好在这里包含链接的重要元素(虽然在本例中,我不会包含整个宏)。@Joe-我试图添加更多的上下文,但我不确定是什么让答案更好或更有启发性。你会推荐什么,在将来更完整地回答?老实说,对于这件具体的事情,我也不确定我会做什么。通常我会包括宏的文本(这样有人在谷歌上搜索这个问题并找到这篇文章就可以复制它),但宏太长了,无法包含在答案中;考虑到结果只是“运行这个宏”,我不确定什么是最好的。我觉得你放的东西很好。(尽管考虑到他的编辑,我认为这个答案实际上对OP没有帮助,但这只是一个旁注。)非常感谢。这两篇论文中的细节非常好!我会试着运行宏。仅供参考-我在中发布了这个。大家的共识是,如果你想发表这样的文章,也要发表足够多的文章,让用户在不阅读论文的情况下复制论文中采用的方法(不一定是代码,而是所采用的策略/方法)。