2015年11月25日水曜日

REPORTプロシジャ入門5:転置集計【ACROSS】



「ACROSSオプション」 を使うと、集計結果を横に転置したような形で出力することができます。



構文

  DEFINE   変数名  /  ACROSS ;

📝
ACROSSオプションは、ORDER・GROUPオプションと同様、欠損値のオブザベーションが除外されたり、並び順がおかしくなる注意点もあるので以下記事も要確認。



サンプルデータ

data DT1;
input A$ B C @@;
cards;
aa 10 11  bb 20 22  aa 10 22  aa 10 11  bb 20 22
;
 A  
 aa
 10 
 11 
 bb 
 20 
 22 
 aa
 10
 22
 aa 
 10 
 11 
 bb 
 20 
 22 



簡単な例

proc report data=DT1 nowd;
  column A;
  define A / across ;
run;

Aの値「aa」「bb」を横に並べて、各値の度数を出しています。


以下のように複数の変数を横に並べることも可能。

proc report data=DT1 nowd;
  column A B;
  define A / across ;
  define B / across ;
run;



変数のネスト

COLUMNステートメントにカンマ「 , 」を入れると変数をネストして度数集計することが可能。

proc report data=DT1 nowd;
  column A , B;
  define A / across ;
  define B / across ;
run;

AとBの組み合わせの度数を求めています。


また以下のように、変数をカッコ囲むと、ネスト先で横に並べることができます。

proc report data=DT1 nowd;
  column A , (B C);
  define A / across ;
  define B / across ;
  define C / across ;
run;

AとB, AとCの組み合わせの度数を求めています。



ちなみに、ANALYSISオプションを用いて度数以外の集計も可能。

proc report data=DT1 nowd;
  column A , B;
  define A / across ;
  define B / analysis sum ;
run;

Aの値毎にBの合計値を求めています。



クロス集計

proc report data=DT1 nowd;
  column A B;
  define A / group ;
  define B / across ;
run;

GROUPとACROSSを組み合わせて、クロス集計が出来ます。





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

2.ヘッダーの設定
3.並べ替え・グループ化【ORDER, GROUP】
5.転置集計【ACROSS】

2015年11月18日水曜日

REPORTプロシジャ入門4:集計【ANALYSIS】


DEFINEステートメントの 「ANALYSISオプション」 を使うと集計ができます。




構文

DEFINE  変数名  /  ANALYSIS  統計量  ;

※ 統計量 … N, MEAN, MAX, MIN, MEDIAN, STD, STDERR, SUM、、、など




サンプルデータ

data DT1;
input NO$ A @@;
cards;
002 20  002 40  001 10  001 30  . .
;

 NO  
 A  
 002
 20 
 002 
 40 
 001
 10
 001 
 30 
  
 . 




① 単純な集計

proc report data=DT1 nowd;
   column  A;
   define  A    / analysis sum ;
run;



② グループ毎の集計

proc report data=DT1 nowd;
   column  NO A;
   define  NO  / group ;
   define  A    / analysis sum ;
run;

📝
GROUPオプションは欠損値のオブザベーションが除外されたり、並び順がおかしくなる注意点もあるので以下記事も要参照。


③ ひとつの変数に対して複数の統計量を求める


以下は変数Aに対して、合計と平均を求めています。

proc report data=DT1 nowd;
   column  A  A=A2;
   define  A    / analysis sum "合計" ;
   define  A2  / analysis mean "平均値" ;
run;


以下のように同じ変数を複数のDEFINEステートメントに指定することは出来ません。

   define  A  / analysis sum "合計" ;
   define  A  / analysis mean "平均" ;

なので、COLUMNステートメントにて「A=A2」と書いて、A2というAの別名をつくり、

2015年11月17日火曜日

区切り文字をつけて変数値同士を結合する【CATX関数】



「文字変数」区切り文字つきで結合」する方法を紹介。



data DT1;
   length  A B C D $5.  VAR1 $30.;
   A = "aa";
   B = "bb";
   C = "";
   D = "dd";

   * 区切り文字をつけて文字変数の値を結合 ;
   VAR1 = catx( "," , A, B, C, D ) ;
run;

A
 B 
  C  
 D 
 VAR1 
  aa  
  bb  
  
  dd 
  aa,bb,dd 


CATX関数は変数値を区切り文字つきで結合してくれます。


構文


  CATX( "区切り文字" , 変数1, 変数2, ・・・ )



ポイント
  • 変数値の先頭か末尾に半角スペースがある場合は、それらを削除してから結合する。
  • 文字変数が欠損値の場合は、その変数はスキップされる (区切り文字もつかない)。
    • 上の例では、Cが欠損値なので「aa,bb,,dd」ではなく「aa,bb,dd」となります。


2015年11月12日木曜日

REPORTプロシジャ入門3:並べ替えとグループ化【ORDER, GROUP】




サンプルデータ

data DT1;
input NO$ NO2$ A @@;
cards;
002 1 10  002 1 20  002 2 30  002 2 40
001 1 50  001 1 60  001 2 70  001 2 80  . . .
;





行の並べ替え

proc report data=DT1 nowd spanrows;
   column  NO NO2 A;
   define  NO  / order ;
   define  NO2 / order ;
   define  A   / display ;
run;



ORDER を指定した変数で行を並べ替えます。

ポイント
  • 以下のように、ORDER変数で同じ値が繰り返す部分は空白表示になる(左から2つ目の表)
  • この部分は「SPANROWS」で、単一のセルにまとめられる(左から3つ目の表。このオプションはODS出力の種類によってサポートされていなかったり、挙動が異なるので注意)

  • ORDER変数の元々の格納値が欠損値だと、その行は出力から除外される(欠損値の行も出力する方法は下のほうで解説)



行のグループ化

proc report data=DT1 nowd spanrows;
   column  NO NO2;
   define  NO  / group ;
   define  NO2 / group ;
run;



GROUP を指定した変数でグループ化(組み合わせ毎に1行化)します。

ポイント
  • ORDERのところで説明したポイントと同じ
  • あと、同じPROC REPORT内で、GROUP変数のほかにDISPLAY変数も設定した場合、グループ化出来ない&NOTEメッセージが表示されるので、取り扱い注意!



欠損値の出力


ORDER, GROUP,(あと別記事で解説しているACROSS)を指定した変数の元々の格納値が欠損値だと、その行は出力から除外されます。

以下2つの方法で欠損値の行も出力可能です。


方法1

PROC REPORTステートメントに「MISSING」を指定する。
この方法は、PROC REPORT内の全ORDER, GROUP, ACROSS変数に対して効力がある。

proc report data=DT1 nowd spanrows missing;
   column  NO NO2 A;
   define  NO  / order ;
   define  NO2 / order ;
   define  A   / display ;
run;




方法2

DEFINEステートメントに「MISSING」を指定する。
この方法は、MISSINGを指定したDEFINEステートメント内のみに効力がある。

proc report data=DT1 nowd spanrows;
   column  NO NO2 A;
   define  NO  / order missing;
   define  NO2 / order missing;
   define  A   / display ;
run;

(気をつけたいのが、例えばX, YというORDER変数があったとして、XにはMISSINGを指定して、Yには指定しなかった場合、、Xの格納値がなんであろうと、Yの元々の格納値が欠損値だとその行は出力から除外されます)



注意点


SASのマニュアルに今後のリリースで設定を変更するかもという注意があったので、2015/11/12時点での話になりますが、ORDER, GROUP, ACROSSを指定した変数は「ORDER=FORMATTED」という、データの並べ替えの方法が裏で設定されていて、これがちょっと混乱を招くおそれがあります。

以下記事をご覧ください。

2015年11月10日火曜日

REPORTプロシジャ入門2:ヘッダーの設定


ヘッダーを自分なりにカスタマイズする方法を紹介。



サンプルデータ

data DT1;
input NO$ A B;
cards;
001 1 4
002 2 5
003 3 6
;



【その1】 ヘッダーの指定

proc report data=DT1 nowd ;
   column NO A B;
   define  NO /  display  "項目1" ;
   define  A    /  display  "項目2" ;
   define  B    /  display  "項目3" ;
run;

(※ヘッダーを指定しないと、変数ラベルまたは変数名が表示されます)



【その2】 ヘッダーを改行する

proc report data=DT1 nowd split="#";
   column NO A B;
   define  NO /  display  "項目#1" ;
   define  A   /  display  "項目#2" ;
   define  B   /  display  "項目#3" ;
run;

  • SPLIT="半角文字"」で指定した半角文字をヘッダーの改行用文字に設定できます。
  • SPLIT=を指定しないと、デフォルトでスラッシュ「/」が改行用文字になります。
  • ODS出力の種類(LISTING, HTML, RTFなど)によって、ヘッダー部分のみに機能したり、データ部分にも機能したりと挙動が異なるので、各自で挙動確認した方が良いです。


【その3】 ヘッダーを2段にする

proc report data=DT1 nowd;
   column  NO  ("ああ" A B) ;
   define  NO /  display ;
   define  A   /  display ;
   define  B   /  display ;
run;


構文
COLUMN   ( "ヘッダー"   変数名1  変数名2 ・・・ ) ;

  • まず2段にしたい部分をカッコで囲みます。
  • ヘッダーを指定することで1段追加することができ、
  • 変数名を指定することで、次の段に変数を並べる事ができます。


応用
以下のように、カッコをネストする事も可能。
proc report data=DT1 nowd;
   column  NO  ("ああ"  ("いい" A)   ("うう" B)  ) ;
   define  NO /  display ;
   define  A   /  display ;
   define  B   /  display ;
run;


さらに書式などを細かく設定するにはSTYLE=オプションというものがあり、別記事で紹介予定。



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

2.ヘッダーの設定
3.並べ替え・グループ化【ORDER, GROUP】

2015年11月5日木曜日

REPORTプロシジャ入門1:基本構文【COLUMN, DEFINE】





REPORTプロシジャは、データセットの中身を出力するPRINTプロシジャの拡張版みたいなやつです。




基本構文

PROC REPORT   DATA=データセット名  NOWD ;
       COLUMN   変数名1 変数名2 変数名3 ・・・ ;

       DEFINE     変数名1  /  オプション ;
       DEFINE     変数名2  /  オプション ;
       DEFINE     変数名3  /  オプション ;
       ・・・ 
RUN;

  • NOWD    …  これを指定しないと余計な画面が出てしまう(SAS9.4からNOWDがデフォルト)
  • COLUMN … 出力する変数名を列挙。
  • DEFINE   … COLUMNで指定した変数へのオプションを指定






* サンプルデータ ;
data DT1;
input NO$ A:yymmdd10.;
cards;
001 2015/01/01
002 2015/01/02
003 2015/02/10
;

* PROC REPORT ;
proc report data=DT1 nowd;
    column NO A;
    define NO  /  display  ;
    define A    /  display  f=yymmdd10.;
run;


  • 変数の値を集計したりグループ化したりするのではなく、そのまま使いたい場合は、DEFINEステートメントにDISPLAYオプションをつける。
  • フォーマットを当てて出力する場合は、DEFINEステートメントにFORMAT=(またはF=)オプションをつける。



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

2015年11月2日月曜日

CLASSステートメントは分割して書ける


CLASSステートメントが使えるプロシジャ全てに対応している機能か不明(使えてもリファレンスに詳細が記載されていないものがある)なので、
今回は、リファレンスにも詳細記載しているMEANSプロシジャで解説していきます。


サンプルデータ

* Sample data ;
data DT1;
input A B VAL;
cards;
1 1 10
2 1 15
. 1 12
. . 13
;
 A  
 B  
 VAL  
  1    1  10
  2    1  15
  .    1  12
  .    .  13



CLASSステートメントの分割


以下よくあるプログラムですが、、、
proc means data=DT1;
  var VAL;
  class A B;
run;


CLASSステートメントを分割して書くことが出来る。
proc means data=DT1;
  var VAL;
  class A;
  class B;
run;


分割して書けるから何なの?って感じですが、
以下のように「CLASS変数の一部にオプションを適用させたいとき」に便利です。

proc means data=DT1;
  var VAL;
  class A / descending;
  class B;
run;

上の例では、変数Aのみ降順に出力するよう descendingオプションを設定しています 。



ちょっとした注意点

以下では変数Aだけmissingオプションをつけて、欠損値のものも分類として出力させています。

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



ただし、たとえAが欠損値でも、missingオプションを適用させていないB も欠損値であれば、分類として出力されません。(サンプルデータ4行目)

 A  
 B  
 VAL  
  1    1  10
  2    1  15
  .    1  12
  .    .  13


その他

TABULATEプロシジャはCLASSステートメントを使いまくるので、今回の方法が役に立つと思います。