かきためぬ

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

【SAS】SCAN関数を活用して「1-1」みたいな値を持つ文字変数をソートする

  • テストデータ作成
DATA test;
  INPUT id $;
  CARDS;
  2-2
  1-3
  1-9
  2-6
  1-4
  2-5
  1-6
  1-7
  1-8
  2-7
  1-10
  2-1
  1-2
  2-4
  2-3
  1-1
  2-8
  1-5
  2-9
  2-10
  ;
RUN;

f:id:hhohh:20160907225833p:plain


この文字変数を
1-1
1-2
1-3
1-4
1-5
1-6
1-7
1-8
1-9
1-10
2-1
2-2
2-3
2-4
2-5
2-6
2-7
2-8
2-9
2-10

↑こうソートしたいけど、このままSORTプロシジャを実行すると

PROC SORT DATA=test;
  BY id;
RUN;

うまくいかない。
f:id:hhohh:20160907230047p:plain









SCAN関数を使ってソートに使う変数を作る

「-」を区切り文字として変数idを区切って、それぞれ別々の変数id1、id2に入れる

DATA test2;
  SET test;


  /*「-」の前の部分を変数id1に入れる*/
  id1=SCAN(id,1,'-');

  /*「-」の後ろの部分を変数id2に入れる*/
  id2=SCAN(id,2,'-');

  
  /*id2の長さが1だったら「0」を前につける*/
  IF LENGTH(id2)=1 THEN id2='0'||id2;

RUN;


id1、id2でソートすると

PROC SORT DATA=test2;
  BY id1 id2;
RUN;

想定通りにidがソートされた。
f:id:hhohh:20160907231347p:plain




id1、id2がいらないならDROPステートメントとかで削除する


DATA test2;
  SET test2;
  
  DROP id1 id2;
RUN;


f:id:hhohh:20160907231646p:plain