Sas PROC表示所有数值变量的输出最小最大中值
我的情况与所问的问题类似。但是,我不想在Sas PROC表示所有数值变量的输出最小最大中值,sas,Sas,我的情况与所问的问题类似。但是,我不想在var语句中列出我的300个变量名,因为它们都是唯一的。是否有方法使用proc means或proc summary输出一个数据集中所有数值变量的汇总统计信息 我试过: proc means data=my_data min median max; output out=summary_data min=min median=median max=max; run; 但这仅输出第一个变量的汇总统计信息。我还借助于ods trace: proc m
var
语句中列出我的300个变量名,因为它们都是唯一的。是否有方法使用proc means
或proc summary
输出一个数据集中所有数值变量的汇总统计信息
我试过:
proc means data=my_data min median max;
output out=summary_data min=min median=median max=max;
run;
但这仅输出第一个变量的汇总统计信息。我还借助于ods trace
:
proc means data=my_data min median max;
ods output Summary=summary_data;
run;
这为我提供了所有变量的汇总统计信息,但仍在一行中:
VName_VAR1 VAR1_Minimum VAR1_Median VAR1_Maximum VName_VAR2 VAR2_Minimum etc...
VAR1 3 3 3 VAR2 3
我的变量名都是唯一的。是否有其他方法使用proc means
或proc summary
输出一个数据集中所有数值变量的汇总统计信息
更新:
当我删除min=min median=median max=max
时:
proc means data=my_data min median max;
output out=summary_data;
run;
然后,代码生成输出:
Obs _TYPE_ _FREQ_ _STAT_ VAR_1 VAR_2 ... etc
1 0 91 N 91.00 91 ... etc
2 0 91 MIN 2005.00 13 .
3 0 91 MAX 2014.00 13 .
4 0 91 MEAN 2009.34 13 .
5 0 91 STD 3.02 0
Obs _NAME_ min median max
1 Cylinders 3.0 6.0 12.0
2 EngineSize 1.3 3.0 8.3
3 Horsepower 73.0 210.0 500.0
4 Invoice 9875.0 25294.5 173560.0
5 Length 143.0 187.0 238.0
6 MPG_City 10.0 19.0 60.0
7 MPG_Highway 12.0 26.0 66.0
8 MSRP 10280.0 27635.0 192465.0
9 Weight 1850.0 3474.5 7190.0
10 Wheelbase 89.0 107.0 144.0
但是,它仍然没有给我中位数。更新 这是一个基于宏的解决方案,添加了新的逐步注释。它使用SAS
字典.columns
中的元数据来发现数据集中的所有数值变量。基本上,我取所有数值变量的MIN
、MEDIAN
和MAX
,将结果输出到三个独立的数据集中。然后,我连接数据集,使用变量中的,找出每一行的来源,并用适当的统计名称对其进行标记。然后输出三行和n
列
正如OP在他的回答中所展示的,获取数值变量的整个宏/元数据都可以通过简单地使用特殊的\u numeric\u
变量来替代。我将保留当前的方法,以防有人有兴趣将其用于其他用途
此外,OP的答案是一个无宏的解决方案,它使用PROC TRANSPOSE
到达与此相同的位置,而不需要任何单独结果集的串联。我敦促所有读者对它进行评论,因为它更像SAS
当我在使用proc means
之前转置数据时,我得到了所需的输出
proc sort data=sashelp.cars out=cars; by _character_;run;
proc transpose data=cars out=cars_t;
var _numeric_;
by _character_;
run;
proc sort data=cars_t;by _name_;run;
proc means data=cars_t noprint;
output out=cars_summary(drop = _type_ _freq_) min=min median=median max=max;
by _name_;
run;
然后,代码生成输出:
Obs _TYPE_ _FREQ_ _STAT_ VAR_1 VAR_2 ... etc
1 0 91 N 91.00 91 ... etc
2 0 91 MIN 2005.00 13 .
3 0 91 MAX 2014.00 13 .
4 0 91 MEAN 2009.34 13 .
5 0 91 STD 3.02 0
Obs _NAME_ min median max
1 Cylinders 3.0 6.0 12.0
2 EngineSize 1.3 3.0 8.3
3 Horsepower 73.0 210.0 500.0
4 Invoice 9875.0 25294.5 173560.0
5 Length 143.0 187.0 238.0
6 MPG_City 10.0 19.0 60.0
7 MPG_Highway 12.0 26.0 66.0
8 MSRP 10280.0 27635.0 192465.0
9 Weight 1850.0 3474.5 7190.0
10 Wheelbase 89.0 107.0 144.0
如果原始数据中的每一行都有一个唯一的id,则此操作有效。如果您刚好在min/med/max之后,则以下操作将有效(这样您就不必命名变量):-
如果您需要其他类型的度量值-均值、标准差等-proc单变量将它们输出到单独的数据集中,这意味着您需要合并表等-这又变成了一个难题
SAS的输出数据集可能真的非常糟糕,对于我来说,proc means是最糟糕的例子。为什么不在means语句中使用stackods选项
ods listing close;
ods output summary=s;
proc means data=mydata stackods min median max;
run;
ods output close;
ods listing;
proc print;
run;
有道理。我在寻找一个不使用var
语句的解决方案。看起来很奇怪,我第一次尝试的列表输出确实打印了我想要的内容,但只将第一行输出到我的数据集。第二次。。。谁知道为什么SAS会将所有数据输出到一行中。对于第一行,因为您没有var
,SAS会查找要在OUTPUT
语句中指定的分析变量,例如OUTPUT。最小值(变量1变量2….)=
。没有找到它,它只是默认为第一个变量。我不太确定第二个,因为我不经常使用ODS来选择输出片段,但我猜ODSSummary
元素的格式就是这样的;输出=汇总数据;运行代码>删除min=min median=median max=max
然后它就如我所期望的那样工作了。我的代码和你的代码都没有输出中值。我可能会被一行输出所困扰,并使用proc transpose
将输出放入一个更为用户友好的表格中。您正在寻找的格式是3行(最小、中值、最大)和n
列作为变量?还是只有一行的nx3
列有唯一的名称?我同意。我发现它工作的另一种方式是首先转置数据,以便变量名位于列中。按变量名排序,然后使用过程中的by
语句。也同意重新设置SAS输出数据集+1展示了一个使用ODS以编程方式存储数据的好例子。+1这太棒了,我希望我能把这个答案标记出来,而不是我的!我一直在寻找方法来减少我对宏的过度依赖。例如,我不知道\u字符
和\u数字
特殊变量。我打算在聊天室呆一会儿,以防你想说得更多。比我的答案好+1,因为你可以要求其他单变量统计数据,如平均值、标准偏差等。不过,应该不会这么难……OP早就不存在了,但这可能是最好的解决方案。