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 手段で出力オプションを使用していると仮定すると (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 のオン/オフは、作成されたテーブルの名前 (つまり、'summary') を表示することです。本番環境では必要ありません。この場合、(PROC MEANS ステートメントで) 出力ウィンドウに統計を要求するのと同じ方法で統計を要求します。

編集に基づいて、転置します (統計ごとに 1 行)。直接はわかりませんが、移調はそれほど難しくありません。

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). -1 (逆方向) を使用するため、Stat は問題ないはずです。変数名が最大 23 文字を超える可能性がある場合、切り捨てられたり変更されたりする可能性があるため、正確な変数名を取得できない可能性があります。その場合は、上記の ODS OUTPUT ソリューションが役立ちます (追加の列に元の変数の名前が表示されるため) が、その値を切り捨てられた名前に関連付けるには、さらに作業が必要になります。

また、配列の定義を簡略化するために_TYPE_とも削除します。_FREQ_それらが必要な場合は、それらを個別に出力しないように除外して保持するためのコードを少し書く必要があります。

于 2013-06-07T14:54:54.673 に答える
3

この論文には、説明に適合するデータセットを出力するためのマクロコードとともに、説明した正確な問題についての優れた議論があります。

より良い手段 — ODS データ トラップ

更新: 「追加機能をサポートし、驚くべきエラーを排除するマクロの改訂版を提示する」というより最近の論文があることを発見しました。これは更新されたソリューションです。

PROC MEANS の SAS® ODS データ トラップを解決する

マクロは適切に設計されているように見え、さまざまな可能性のある問題を回避します。出力データセットを作成するために使用されるゆがみには、proc means(もちろん) 、proc sqlproc contents、およびproc datasetsマクロ言語アーキテクチャの広範な使用が含まれます。これらの説明は、この回答ではおそらく有益ではありません。私はそれを自分で完全に理解しているとは主張していません。

ただし、マクロをコンパイルすると、1 つの簡単なステートメントで目的のデータセットを作成できるはずです。

%better_means(data=MyDataSet)

この便利なソリューションを見つけたので、自分で使い始めるかもしれません。

于 2013-06-07T15:22:29.903 に答える