私はSASの初心者ですが、次の問題があります。
1つのデータセットからいくつかの変数(A B C)のカウントとパーセントを計算し、その結果を別のデータセットに保存する必要があります。私のコードは:
proc freq data = mydata;テーブルAB C/out = data_out;実行;
各変数のプロシージャの結果はSAS出力ウィンドウに表示されますが、data_outには最後の変数の結果のみが含まれます。すべてをdata_outに保存する方法は?助けていただければ幸いです。
ODS OUTPUT
があなたの答えです。 OUT=
を使用して直接出力することはできませんが、次のように出力できます。
ods output OneWayFreqs=freqs;
proc freq data=sashelp.class;
tables age height weight;
run;
ods output close;
OneWayFreqsは一方向テーブルです。(n> 1)-wayテーブルはCrossTabFreqsです。
ods output CrossTabFreqs=freqs;
ods trace on;
proc freq data=sashelp.class;
tables age*height*weight;
run;
ods output close;
ods trace on;
を実行してから、最初のprocを(画面に対して)実行することで、正しい名前を見つけることができます。ログ内の出力の名前が表示されます。 (ods trace off;
見るのに飽きたとき。)
ここで学ぶための良い基本的なSASのものがたくさん
1)データセットが上書きされないように、異なる出力データセット名で3つのproc freqステートメント(変数a b cごとに1つ)を実行します。
2)out =ステートメントで名前変更オプションを使用して、データセットを結合するときのカウント変数とパーセント変数を変更します
3)カテゴリで並べ替え、すべてのデータセットをマージします
(複数の変数に表示される値があると想定していますが、そうでない場合は、データセットをスタックするだけで済みます)
data mydata;
input a $ b $ c$;
datalines;
r r g
g r b
b b r
r r r
g g b
b r r
;
run;
proc freq noprint data = mydata;
tables a / out = data_a
(rename = (a = category count = count_a percent = percent_a));
run;
proc freq noprint data = mydata;
tables b / out = data_b
(rename = (b = category count = count_b percent = percent_b));
run;
proc freq noprint data = mydata;
tables c / out = data_c
(rename = (c = category count = count_c percent = percent_c));
run;
proc sort data = data_a; by category; run;
proc sort data = data_b; by category; run;
proc sort data = data_c; by category; run;
data data_out;
merge data_a data_b data_c;
by category;
run;
9.3でPROCMEANSに追加されたオプションSTACKODS(OUTPUT)により、これははるかに簡単なタスクになります。
proc means data=have n nmiss stackods;
ods output summary=want;
run;
| Variable | N | NMiss |
| ------ | ----- | ----- |
| a | 4 | 3 |
| b | 7 | 0 |
| c | 6 | 1 |
これは私が何度も扱ってきた質問であり、SASこれを行うためのより良い方法があったらいいのにと思います。
私の解決策は、一般化されたマクロであり、入力データ、変数のリスト、および出力データセットの名前を提供します。私はあなたがしなければならない変数のフォーマット/タイプ/ラベルを考慮に入れます
それが役に立てば幸い:
https://Gist.github.com/statgeek/c099e294e2a8c8b5580a
/ *説明:パーセント/カウントを含む変数の一方向周波数テーブルを作成しますパラメーター:dsetin-inputdatasetvarlist-スペースで区切られた分析対象の変数のリストdsetout-作成するデータセットの名前
著者:F.Khurshed日付:2011年11月
* /
%macro one_way_summary(dsetin, varlist, dsetout);
proc datasets nodetails nolist;
delete &dsetout;
quit;
*loop through variable list;
%let i=1;
%do %while (%scan(&varlist, &i, " ") ^=%str());
%let var=%scan(&varlist, &i, " ");
%put &i &var;
*Cross tab;
proc freq data=&dsetin noprint;
table &var/ out=temp1;
run;
*Get variable label as name;
data _null_;
set &dsetin (obs=1);
call symput('var_name', vlabel(&var.));
run;
%put &var_name;
*Add in Variable name and store the levels as a text field;
data temp2;
keep variable value count percent;
Variable = "&var_name";
set temp1;
value=input(&var, $50.);
percent=percent/100; * I like to store these as decimals instead of numbers;
format percent percent8.1;
drop &var.;
run;
%put &var_name;
*Append datasets;
proc append data=temp2 base=&dsetout force;
run;
/*drop temp tables so theres no accidents*/
proc datasets nodetails nolist;
delete temp1 temp2;
quit;
*Increment counter;
%let i=%eval(&i+1);
%end;
%mend;
%one_way_summary(sashelp.class, sex age, summary1);
proc report data=summary1 nowd;
column variable value count percent;
define variable/ order 'Variable';
define value / format=$8. 'Value';
define count/'N';
define percent/'Percentage %';
run;
相変わらず、SASでこの種のことを行うにはさまざまな方法があります。他のいくつかのオプションがあります:
proc summary data = sashelp.class;
class age height weight;
ways 1;
output out = freqs;
run;
proc freq
で複数のテーブルステートメントを使用しますSASは、入力データセットを3回ではなく、1回読み取るだけでよいため、これは3つの個別のprocfreqステートメントを実行するよりも効率的です。
proc freq data = sashelp.class noprint;
table age /out = freq_age;
table height /out = freq_height;
table weight /out = freq_weight;
run;
data freqs;
informat age height weight count percent;
set freq_age freq_height freq_weight;
run;