ラベル [▼ 連番をふる の投稿を表示しています。 すべての投稿を表示
ラベル [▼ 連番をふる の投稿を表示しています。 すべての投稿を表示

2014年2月13日木曜日

グループ間連番をふる方法


グループ間連番をふる方法を簡単に紹介。


サンプルデータ

data DT1;
input SUBJID$  VAL$;
cards;
001  a
001  b
005  c
005  d
005  e
010  f
010  g
;

データセット「DT1」
SUBJID  VAL
001         a
001         b
005         c
005         d
005         e
010         f
010         g

求めたい結果
「SUBJID」毎の連番をふる。

SUBJID  VAL  SEQ
001         a        1
001         b        1
005         c        2
005         d        2
005         e        2
010         f         3
010         g        3





連番をふる

*** 方法1 **********;
proc sort data=DT1; by SUBJID; run;

data DT2;
  set DT1;
  by SUBJID;

  if  first.SUBJID then SEQ+1 ;
run;

*** 方法2 **********;
proc sort data=DT1; by SUBJID; run;

data DT2;
  set DT1;
  by SUBJID;

  SEQ + first.SUBJID ;
run;

方法1もそんなに面倒な処理をしていないので、この方法でも良いけど、
方法2の方がスッキリしてるのでおすすめ。



📝注意点

今回のテクニックの中で使用している「FIRST.BY変数」は「サブセット化IF」と一緒に使用すると正しく動かなくなる事があります。
(解説記事:「サブセット化IFでありがちな落とし穴」)



2014年1月31日金曜日

行番号を取得する方法




基本的な方法や、あまり知られていない方法をいくつか紹介したいと思います。



*** サンプルデータ ;
data DT1;
input V$;
cards;
a
b
c
d
e
;
*** 行番号を取得 ;
data DT2;
  set DT1;

  * 方法① ;
    OBSN1 + 1;

  * 方法② ;
    OBSN2 = _N_;

  * 方法③ リファレンスに記載のない関数のため非推奨 ;
    OBSN3 = monotonic();
run;



解説

方法①
「変数名 + 1」と書くと、前のオブザベーションの変数値を引き継いで、「+1」していってくれる。

方法②
「_N_」はSASの自動変数で、データステップの反復回数が格納されています。
データステップは内部の動きとして、オブザベーションの数だけ、データステップをぐるぐるとループ(反復)させています。
ループのたびに1オブザベーションずつ読み込んでいるイメージで、「_N_」はそのループ毎に「+1」した番号が入ります。


方法③ (リファレンスに記載のない関数のため非推奨)
MONOTONIC関数は方法①と同じような挙動をします。



注意事項

方法①~③は厳密には挙動が異なります。
たとえば以下のプログラム実行後、それぞれの方法での結果を見ると異なっています。

data DT3;
  set DT1;
  if V in ("a","c","e");

  * 方法① ;
    OBSN1 + 1;

  * 方法② ;
    OBSN2 = _N_;

  * 方法③ ;
    OBSN3 = monotonic();
run;



これは行番号を振るタイミングが異なるため。

方法①と③:
SET文・WHERE文で読み込まれたオブザベーションに対して番号を振るのですが、、
番号を振る前にサブセット化IF「if  V  in  ("a","c","e")」が実行されていますよね。
このサブセット化IFにより処理が継続されたオブザベーションに対して、番号をふっています。

方法②(自動変数「_N_」):
まずSET文・WHERE文で読み込むオブザベーションに対して、データステップがループ(反復)されますが、自動変数「_N_」は、各反復内でいち早く番号がふられます。
番号をふった後で、サブセット化IFにより処理が継続されなかったオブザベーションがあると、番号が連番にならなくなります。


MONOTONIC関数の注意点を追加。

monotonic関数でアイタタタ(データステップ100万回)


2013年12月27日金曜日

グループ内連番をふる方法。


グループ内連番をふる機会はすごく多いと思うので、まとめてみました。


サンプルデータ

data DT1;
input SUBJID$ V$;
cards;
001 a
001 b
001 c
002 x
002 y
;


求めたい結果
「SUBJID」毎に「V」の順番で連番をふる。





データステップで連番をふる

*** 方法1 **********;
proc sort data=DT1; by SUBJID V; run;

data OUT1;
  set DT1;
  by SUBJID V;

  if first.SUBJID then SEQ=0;
  SEQ+1;
run;

*** 方法2 **********;
proc sort data=DT1; by SUBJID V; run;

data OUT1;
  set DT1;
  by SUBJID V;

  SEQ+1-first.SUBJID*SEQ;
run;


・方法1が一般的なやり方だと思う。
・方法2は仕組みを理解すれば1行で書けるのでおススメ。


📝注意点

今回のテクニックの中で使用している「FIRST.BY変数」は「サブセット化IF」と一緒に使用すると正しく動かない事があります。
(解説記事:「サブセット化IFでありがちな落とし穴」)