かきためぬ

書き溜めたいきもちは山々だけど

【SAS】オブザベーション数をカウントする【SQLプロシジャは使用しない】

データセットのオブザベーション(行数)をカウントするやり方


  • テストデータを作成
*変数category、valueを持つデータセット「test」を作成;
DATA test;
  INPUT category value;
  CARDS;
  2 257
  1 172
  3 169
  3 208
  2 408
  2 400
  1 315
  1 156
  3 30
  1 262
  1 484
  3 297
  ;
RUN;
  • ↓データセット「test」の中身。オブザベーション数は12

f:id:hhohh:20160907203157p:plain




  • オブザベーション数をカウント
DATA count(KEEP=cnt);/*KEEP=により、変数cntのみをデータセットに保持*/

  *データセット「test」を読み込み;
  SET test END=last; /*END=により、最後のオブザベーションを読み込んだ時の動作を設定できる*/
  
  *RETAINステートメントにより、前のオブザベーションの変数cntの値を保持する;
  RETAIN cnt 0;
  
  *1オブザベーション読み込むごとにcntに+1;
  cnt+1;
  
  *最後のオブザベーションだけデータセット「count」に出力;
  IF last;
RUN;
  • ↓データセット「count」の中身。変数cntにデータセット「test」のオブザベーション数を値に持っている

f:id:hhohh:20160907210005p:plain








変数categoryの値ごとにオブザベーション数をカウントしたい場合

*見やすくするため、SORTプロシジャを使ってcategoryでソート;
PROC SORT DATA=test;
  BY category;
RUN;

f:id:hhohh:20160907212258p:plain







  • categoryごとにオブザベーション数をカウント
DATA count(KEEP=cnt1 cnt2 cnt3);
  SET test END=last;   
  RETAIN cnt1 0 cnt2 0 cnt3 0;
  
  *categoryが1のときcnt1に+1;
  IF      category=1 THEN cnt1+1;
  
  *categoryが2のときcnt2に+1;
  ELSE IF category=2 THEN cnt2+1;
  
  *categoryが3のときcnt3に+1;
  ELSE IF category=3 THEN cnt3+1;
  
  IF last;

RUN;
  • 変数cnt1、cnt2、cnt3にそれぞれcategory1、2、3のオブザベーション数を持つ

f:id:hhohh:20160907211109p:plain