2015年7月6日月曜日

配列(ARRAYステートメント)入門



ARRAYステートメントによる配列の定義方法を紹介していきます。

(※ 書き方のパターンがたくさんあるので、触りのみに留めます)




構文

ARRAY  配列名( 要素数 )   割り当てる変数 ;




array  AR(3) A B C;


まず「array AR(3)」で、ARという配列を定義し、変数や値を3つ割り当てられるようにしてます。
次の「A B C」でこの配列に変数A, B, Cを割り当てています。

割り当てた変数は「AR(1)」や「AR(2)」というように「配列名(要素番号)」で参照する事が出来ます。






具体例

data DT1;
   array AR(3) A B C;

   AR(1) = 10;
   AR(2) = 20;
   AR(3) = 30;
run;

 A  
 B  
 C  
 10 
 20 
 30 


解説
arrayステートメントで各配列に以下の変数を割り当てています。
AR(1) は変数A
AR(2) は変数B
AR(3) は変数C
そのため、「AR(1) = 10;」 と書くと 「A = 10;」 と書いたのと同じ意味になります。


ちなみに配列に割り当ててる変数が「A B C」の3つなので、当然要素数も3つだろってことで、「array AR(*) A B C;」というように、要素数をアスタリスク(*)で省略して書けます。


ここで注意点!
配列に割り当てる変数は、
  • すべて同じ型である必要があります(全て文字変数、または全て数値変数)
  • 「lengthを定義してない新規文字変数」を配列に割り当てる場合は、先にlengthステートメント等で長さを定義しておくのを忘れずに。



実践例

以下は変数が欠損値であればいっぺんに0に置き換える例です。

* サンプルデータ ;
data SAMPLE1;
input A B C;
cards;
10 . 20
. . 30
;

 A  
 B  
 C  
 10 
 . 
 20 
 . 
 . 
 30 

* 欠損値を0に置き換える ;
data DT2;
   set SAMPLE1;
   array AR(*) A B C;
   do i = 1 to dim(AR);
       if AR(i) = . then AR(i)=0;
   end;
   drop i;
run;

 A  
 B  
 C  
 10 
 0
 20 
 0
 0
 30 


解説
array AR(*) A B C;

まず配列ARに変数A,B,Cを割り当てます。


do i = 1 to dim(AR);
   if AR(i) = . then AR(i)=0;
end;

DIM関数は、配列の要素数を返してくれる関数です。つまり

do i = 1 to dim(AR);
   処理
end;

で、変数 i の値を1~3 (配列の要素数) まで変化させながら中の処理を繰り返します。

中の処理 「if AR(i) = . then AR(i)=0」 は、配列の要素番号を1~3まで変化させながら処理が繰り返されるので、以下のように配列に割り当てた変数全てに処理が行われます。
if A = . then A=0;
if B = . then B=0;
if C = . then C=0;


ARRAYとDOループの組み合わせはよく見かける鉄板コンビです。



0 件のコメント:

コメントを投稿