【SAS/プログラミング】retain,合計~僕は過去のことも覚えておく。大切だから。
今回はretainステートメントと合計ステートメントです。
簡単にいえば、前の行の変数の値を保持するステートメントです。
Dataステップでは、行ごとの処理をしますが、
例えば変数の合計値を出したいときに、行ごとだと処理ができません。
前の変数の値を保持しておくことが必要となります。
そんな時に使用するのがretainステートメント!!
便利ですよ!(商売風にいってみた笑)
first,lastステートメントとセットで使うことが多いので、こちらとセットでご覧ください。
1.retainステートメントの使用例と処理の説明
◎サンプルデータ(samp_data001)
/* <Program code 01> */
/* Sort Dataset */
proc sort data=samp_data001; by id type; run;
data test_data01;
Set samp_data001;
By id type;
Retain score_st; /* 1.変数の保持 */
If first.id then score_st=score; /* 2.初期化 */
Run;
① retainステートメントによって、変数total_stの値は保持されます。
② if条件より最初のidレコードの時、total_st変数にscore変数の値を代入します。
こうすることで、最初のidレコードの値が入った変数が作成できます。
<実行結果>
2.retainステートメントに初期値を付与
こちらは任意の設定となります。
数値型変数でよく用いるイメージがありますが、例えば初期値の値を指定した値でスタートさせたい場合や欠損値を入れたくない場合などに用いられるイメージがあります。
/* <Program code 02> */
Data test_data02;
Set samp_data001;
By id;
Retain total_m 100; /* 初期値の設定 */
If score ^=. then total_m= total_m + score;
Run;
<実行結果>
/* 初期値の設定 */の行にてTotal_m変数に初期値100を入れました。
これで、100からスタートします。
初期値を定義していないと、
数値型変数、文字型変数ともに欠損値(空の値)が入ります。
3.合計ステートメント
合計ステートメントは、数値型変数にのみ対応で、
値を前の行から保持し、合計するステートメントです。
/* <Program code 03> */
Data test_data02;
Set samp_data002;
By id;
Total_s+score; /* 合計ステートメント */
Run;
「Total_s+score;」ですが、左側の変数(total_s)が合計する変数で、
右側の変数の値を加算していきます。Total_s = total_s + scoreの省略と思って構いません。
この合計する変数の初期値は自動で0からスタートします。
もし0以外を初期値にしたい場合は、この合計ステートメントは使用できませんので、Retainステートメントを使用してください。
4.まとめ
今回のRetainステートメント、合計ステートメントは
変数の保持の一言ですみますが、First,lastステートメントや
ifなどの条件文を組み合わせることで、
データの1行1行の処理だけにとどまらず、
各行と関連してどのように値を保持するかという応用が利きます。
これで幅が広がったといえますし、ちゃんと組み立てないとぐちゃぐちゃになりがちです(笑)
よく、データの持たせ方には苦労しました。ひとつひとつ整理しつつ作業を進めていきましょう!!