ARRAY配列の要素番号は1から始めなくてもよく、任意の値を設定して意味を持たせられる。loopについてはdim関数の代わりにlbound,hbound関数を使える

ARRAYステートメントによる1次元配列の定義を行った場合、一つ目に配列に含まれる変数が要素番号1をもち、次は2、次は3と連番になっていきます。そこで
do i=1 to dim(配列名);処理;end;といった書き方をして、要素数分処理をループさせたりして利用することが多いと思います。

さて、話は変わって、今以下のようなデータセットがあったとします。

data Q1;
_95=1;_96=5;_97=8;_98=12;output;
run;




適当なデータですが、これは1995年から98年までのある商品の売り上げだとします。
_95は1995年の売上といったように、数字が意味を持っています。

そういった場合で、配列を定義する際、処理の内容によっては要素番号を1からの連番にして
意味を失わせるよりも、任意の数字を定義して、リンクさせた方が処理がわかりやすい場合もあります。

先にコードから

data A1;
set Q1;
 array SALES{95:98} _:;

 X=SALES(97);

run;





ここでSALESという配列を定義していますが{95:98}とすることで、この配列は
要素番号95から98までを持つ配列となります。

たとえば X=SALES(97);とするとxには_97の値、すなわち1997年の売上を取得できます。
X=SALES(1)などと書くと、当然エラーになります。


なるほど、要素番号に任意の数字を設定できるのはわかったとして、じゃあi=1 to dim(配列名)みたいな処理が書けなくなってるんじゃないかと思いますが、

そこはlbound関数やhbound関数を使用できます。こいつらは配列名を引数にとり、その配列の要素番号の最小値または最大値を返します。

つまり

data A2;
 set Q1;
 array SALES{95:98} _:;
 do YEAR=lbound(SALES) to hbound(SALES);
   X=SALES(YEAR);
  output;
 end;
run;

とすると95から98でループがかかります。







面白いです。





0 件のコメント:

コメントを投稿