かきためぬ

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

【SAS】文字列連結③ CATX関数の活用例【連結する変数の数が定まっていないとき】

連結する変数の数が決まってるなら連結演算子(||)でも可能だけど、決まってないときはCATX関数が活用できる。

例えば以下のようなとき。
f:id:hhohh:20161211124215p:plain
元データのほうは、それぞれの人が何個かずつ買うものがあって、その数の分だけレコードをもつ。それを、1人1レコードにまとめたい。

/*元データ作成*/
data sample1;
  length id 8. name item $10.;
  input id name$ item$;
  label item='買うもの';
  datalines;
  1 Rose Book
  1 Rose Pen
  1 Rose Stapler
  2 Nicole Scissors
  2 Nicole Glue
  2 Nicole Notebook
  2 Nicole Book
  3 Stephen Ruler
  3 Stephen Scissors
  4 Teresa Glue
  4 Teresa Notebook
  4 Teresa Book
  4 Teresa Ruler
  4 Teresa Scissors
  5 Brenda Pen
  5 Brenda Notebook
  ;
run;
/*変数idでソート*/
proc sort data=sample1;
  by id;
run;
/*新しい変数「shoppinglist」を作成*/
data sample2;
  set sample1;
  by id;
  length shoppinglist $500.;
  label name='名前' shoppinglist='買い物リスト';
  retain shoppinglist;
  *そのidの1オブザベーション目のときは、itemの値をそのままshoppinglistに入れる;
  if first.id then shoppinglist=item;
  *1オブザベーション目でないときは、shoppinglistの値とitemの値を「/」で結合してshoppinglistに入れる;
  else shoppinglist=catx('/',shoppinglist,item);
  *そのidの最後のオブザベーションのときはoutputした後shoppinglistに欠損値を入れる;
  if last.id then do;
    output;
    call missing(of shoppinglist);
  end;
  keep id name shoppinglist;
run;
  • 作ったデータセットの中身をPRINTプロシジャで表示してみると以下のようになる
proc print data=sample2 label;
run;

f:id:hhohh:20161211131447p:plain