web-dev-qa-db-ja.com

SAS procfreqから複数のテーブルを使用して結果を保存する

私はSASの初心者ですが、次の問題があります。

1つのデータセットからいくつかの変数(A B C)のカウントとパーセントを計算し、その結果を別のデータセットに保存する必要があります。私のコードは:

proc freq data = mydata;テーブルAB C/out = data_out;実行;

各変数のプロシージャの結果はSAS出力ウィンドウに表示されますが、data_outには最後の変数の結果のみが含まれます。すべてをdata_outに保存する方法は?助けていただければ幸いです。

6
Natalia

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;見るのに飽きたとき。)

4
Joe

ここで学ぶための良い基本的な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;
1
KnowYourOnion

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 |
0
FriedEgg

これは私が何度も扱ってきた質問であり、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;
0
Reeza

相変わらず、SASでこの種のことを行うにはさまざまな方法があります。他のいくつかのオプションがあります:

1. procfreqではなくprocsummaryを使用します。

proc summary data = sashelp.class;
    class age height weight;
    ways 1;
    output out = freqs;
run;

2.1つの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;
0
user667489