2017年3月28日火曜日

一部の集計系プロシジャで使える 「ORDER=オプション」で分類変数の値の出力順をカスタマイズする。




一部の集計系プロシジャ(PROC FREQ, MEANS, REPORTなど)では「ORDER=オプション」をサポートしています。

例えば性別の頻度集計で「男→女」や「女→男」の順で出すなど、出力順をカスタマイズできます。


今回はPROC FREQでの使用例を見ていきましょう。



サンプルデータ

data DT1;
input A @@;
cards;
2 1 1 3 3 3
;




ORDER=オプションの指定例


📝 注意
-----------------------------------------------------------------------
他のオプションとの組み合わせで、ORDER=オプションが機能しなかったり、出力順が変わることがあります。詳細はリファレンスを確認下さい。
(例えば、PROC MEANS等で「PRELOADFMT」や「CLASSDATA=」オプションを使う場合など)
-----------------------------------------------------------------------


  • ORDER = INTERNAL … 変数値を昇順に並び替えて出力
proc freq data=DT1  order=internal;
  tables A;
run;



PROC FREQのデフォルトはORDER=INTERNALです。


  • ORDER = DATA … データセットに格納されている値の順に出力
proc freq data=DT1  order=data;
  tables A;
run;

注意点:「ORDER=DATA」の落とし穴


  • ORDER = FREQ … 度数が多い順に出力
proc freq data=DT1  order=freq;
  tables A;
run;



  • ORDER = FORMATTED … 変数に割り当てたフォーマットに変換させた時の値順。
proc format;
value SEX
1="MALE"
2="FEMALE"
3="UNANSWERED"
;
run;
proc freq data=DT1  order=formatted;
  tables A;
  format A SEX.;
run;




ORDER=オプションの指定場所

指定場所は以下のように様々です。詳細が知りたい方は別途リファレンスをご覧ください。

* PROC MEANS : CLASS変数全体にORDER=オプションを適用 ;
proc means data=xx order=internal;
 var xx;
 class yy;
run;

* PROC MEANS : CLASS変数YYにORDER=オプションを適用 ;
proc means data=xx ;
 var xx;
 class yy / order=internal;
 class zz ;
run;

* PROC REPORT : 出力変数XXにORDER=オプションを適用 ;
proc report data=xx;
  column xx yy;
  define xx / order order=internal;
  define yy / display;
run;



Tips

今回紹介したオプションの他に、よく使用されるMISSINGオプションも参考に。



2017年3月21日火曜日

欠損値の分類も集計に含めるMISSINGオプションと落とし穴



多くの集計用プロシジャでは、分類変数が欠損値のオブザベーションを集計から除きます。



サンプルデータ

data DT1;
input A B C;
cards;
1 1 10
. 1 10
2 1 10
. 1 10
;


変数Aには欠損値が含まれてます。



分類に欠損値が含まれている場合の集計結果

proc freq での例

proc freq data=DT1;
   tables A * B;
run;









変数Aの欠損値2オブザベーションが集計から除かれています。
欠損値も含め集計したい場合、missingオプションをつけます。

proc freq data=DT1;
   tables A * B / missing;
run;



同様に proc means や proc summary でもclass変数が欠損値のオブザベーションは集計から除かれます。
missingオプションをつけるとclass変数が欠損値のものも含め集計されます。

proc means data=DT1;
   class A / missing;
   var C;
run;


proc tabulateも同様。

proc tabulate data=DT1;
   class A / missing;
   table A;
run;




落とし穴①

まずは、proc freq の「なんじゃそりゃ」という落とし穴(proc means や proc tabulateでは問題なさそう)
以下の例をご覧ください。

proc format;
   value A_
      . , 1 = "Missing and One"
      2 = "Two"
   ;
run;

proc freq data=DT1;
   tables A * B;
   format A A_.;
run;



変数Aに欠損値と1をまとめた "Missing and One" というフォーマットを設定して集計しています。
missingオプションを設定していないので、欠損値は集計から除かれますが、なんと、、A=1も欠損値の扱いになって集計から除かれています。

フォーマットで欠損値と非欠損値を1つのカテゴリにまとめた場合、
実データに欠損値が存在すると、同じカテゴリの非欠損値のデータも巻き込んで、欠損値の扱いにしてしまうようです。



落とし穴②

既にSASYAMAさんが記事にされているので、そちらをご覧ください。
means summaryプロシジャのclassステートメント指定変数の欠損値には気を付けてって話

classステートメントに変数を複数指定する場合は注意という話です。
class変数のいずれかに欠損値が含まれている場合、missingオプションがないとそのオブザベーションが全ての集計から除かれてしまいます。



落とし穴③

これも上のSASYAMAさんの記事で注意喚起されていますが、
proc means や proc summary の outputステートメントで集計結果をデータセットに出力すると、

proc means data=DT1;
   class A B / missing;
   var C;
   output out=OUT1 n= mean= / autoname;
run;

集計結果:結果ビューア

集計結果:出力データセットOUT1

出力データセットの方は、結果ビューアにない組み合わせも出力されています。
例えば、出力データセットの1行目は変数AとBの分類全体に対する集計結果です(ただしmissingオプションがない場合、変数AかBが欠損値のオブザベーションは除いたうえで集計される)

特にmissingオプションを設定していると、どの組み合わせに対する集計なのか、分かりづらいです(例:1行目と3行目)


変数_TYPE_で上記の違いを区別することが出来るものの、「紛らわしいので要らない!」というケースがほとんどなので、、

proc means data=DT1 nway;
   class A B / missing;
   var C;
   output out=OUT1 n= mean= / autoname;
run;

nwayオプションで結果ビューアと同じ組み合わせの数に減らせます。


2017年3月7日火曜日

ODSTABLEプロシジャ入門3:変数の設定【DEFINE COLUMN】


出力する変数に対して、オプションを設定する方法を紹介。



基本構文

  PROC ODSTABLE  ・・・;
       DEFINE  COLUMN   出力変数名;
             オプション ;
       END;
  RUN;


または、以下のように事前にCOLUMNステートメントで出力変数名を記述していれば、、
  PROC ODSTABLE  ・・・;
       COLUMN   出力変数名1   出力変数名2 ・・・ ;

       DEFINE  出力変数名1;
             オプション ;
       END;
  RUN;

「DEFINE COLUMN 出力変数名」ではなく「DEFINE 出力変数名」というように縮めて書けます。



オプション一覧(一部)

※ 設定可能なオプションは rtf, html 等の出力先毎に違う&オプションの組み合わせで挙動が変わる事があるので、リファレンスも要参照です。

設定設定内容
header = "列ラベル"

列ラベル
text_split = "改行用区切り文字"

データ部分の改行用区切り文字
blank_dups = on

前のオブザベーションの値と同じだったら値を非表示にする
  • フォーマット適用後の値に対して動作する
  • 他のオプションと組み合わせて挙動を変えることが出来る(記事の下の方に例を載せてます)
vjust = top | center | bottom

縦位置
justify = on
just 
= right | center | left 

横位置
  • 列ラベルも横位置が設定されます(define headerとかで設定していない場合)
style = {書式設定}

  • ods listing以外の出力先(rtf, html等)で設定可能。
    設定できる書式はods出力先毎に違います。記述方法や注意点等とあわせ、リファレンスをご確認下さい。
  • {書式設定} の部分はproc reportでの書き方と似てるので、以下リンク先の記事も参考になると思います


では例をいくつか見ていきましょう。


Sample data

proc sort data=SASHELP.CLASS out=CLASS;
  by AGE WEIGHT;
  where AGE in (13,14);
run;


例①

proc odstable data=CLASS;
  column AGE SEX NAME ;
  define SEX;
      header = "せいべつ";
  end;
run;

変数SEXの列ラベルを「せいべつ」に変えています。


例②

proc odstable data=CLASS;
  column AGE SEX NAME ;
  define SEX;
      define header HEAD_SEX;
         text "せい#べつ";
         split = "#";
      end;
      header = HEAD_SEX;
  end;
run;

ちょっとしたテクニック。
define column内にdefine headerを定義することで、header=オプションで参照することが出来ます。


例③

proc odstable data=CLASS;
  column AGE SEX NAME;
  define AGE;
     blank_dups = on;
  end;
  define SEX;
     blank_dups = on;
  end;
run;

「blank_dups = on」で、前のオブザベーションと同じ値だったら値を非表示に。


また、「classlevels = on」というオプションを設定すると「blank_dups = on」の挙動が変わります。

proc odstable data=CLASS;
  column AGE SEX NAME;
  classlevels = on;

  define AGE;
     blank_dups = on;
  end;
  define SEX;
     blank_dups = on;
  end;
run;

本来、4オブザベーション目のSEXの値「F」は非表示になるはずですが「classlevels = on」によって挙動が変わりました。
「blank_dups = on」を設定した変数内で、i番目の列(AGE)の値が非表示になっていなければ、i+1番目の列(SEX)の値も非表示にしない、という挙動になります。



ODSTABLEプロシジャ入門記事一覧

1.基本構文【COLUMN】
2.ヘッダー・フッター【DEFINE HEADER, FOOTER】
3.変数の設定【DEFINE COLUMN】


2017年3月3日金曜日

PROC REPORTでRTF出力時に小数点の位置を揃える方法



※RTF以外の出力先では、今回紹介するオプションが機能しない場合があるのでご注意ください。


*** サンプルデータ作成 ;
data a;
input a b$;
cards;
90.1 90.1
100 100
12.3 12.3
;
run;


*** RTF出力時に小数点の位置をそろえる ;
ods rtf file="適当なパス\test.rtf";
proc report data=a;
  column a b;
  define a / display style(column) = [ width=80 textalign=dec ];
  define b / display  style(column) = [ width=80 textalign=dec ];
run;
ods rtf close;


styleオプションで「textalign=dec」を指定すると小数点の位置を揃えて出力します(「just=d」と書いてもOK)
便利なのが、上のデータでは変数Bは文字変数なのに小数点位置を揃えてくれている点です。