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来选择输出片段,但我猜ODS
Summary
元素的格式就是这样的;输出=汇总数据;运行删除
min=min median=median max=max
然后它就如我所期望的那样工作了。我的代码和你的代码都没有输出中值。我可能会被一行输出所困扰,并使用
proc transpose
将输出放入一个更为用户友好的表格中。您正在寻找的格式是3行(最小、中值、最大)和
n
列作为变量?还是只有一行的
nx3
列有唯一的名称?我同意。我发现它工作的另一种方式是首先转置数据,以便变量名位于列中。按变量名排序,然后使用
过程中的
by
语句。也同意重新设置SAS输出数据集+1展示了一个使用ODS以编程方式存储数据的好例子。+1这太棒了,我希望我能把这个答案标记出来,而不是我的!我一直在寻找方法来减少我对宏的过度依赖。例如,我不知道
\u字符
\u数字
特殊变量。我打算在聊天室呆一会儿,以防你想说得更多。比我的答案好+1,因为你可以要求其他单变量统计数据,如平均值、标准偏差等。不过,应该不会这么难……OP早就不存在了,但这可能是最好的解决方案。