ARRAYステートメント

配列を定義する。
DATAステップステートメントで指定する。
※複数の変数に対して、同じ処理を行う場合にARRAYステートメントを使用して
配列を定義し、DOステートメントを使用すると便利である。

構文
  1. DATA = SASデータセット名 ; 
  2.  ARRAY 配列名 {要素数} [] [長さ] [配列要素] [(初期値)]
  3. DO I=1 to 5 ;
  4. 配列名{要素数}= x ; /*xを代入*/ 
  5. END ;
  6. run;
  • 使用例
dat1~dat5までの5つの変数をgroup{n}という名前で参照できる。
group{3} … 変数dat3を処理対象とする。

配列名:配列名として有効なSAS名を指定。
    ※SAS関数名や同一DATAステップ中のSAS変数名と同じ名前を付けないように注意。
要素数:配列要素の数を表す数値または(またはアスタリスク)を指定。
    ※括弧は中括弧{}の代わりに、大括弧[]または丸括弧()を使用することができる。

指定形式その1…配列の各次元の要素数を指定。

  • 1次元配列を定義する場合、その配列の要素数をそのまま指定。
例)3つの要素を持つ1次元配列
 ARRAY test {3} red green yellow ;
  • 多次元配列を定義するには、各次元の要素数をコンマで区切って指定。
2次元配列の場合、最初の数値は行、2番目の数値は列に対応。
例)5行3列からなる2次元配列
 ARRAY box {5,3} x1-x15 ;

指定形式その2…添字の上限と下限を指定。(添字の下限defortは1。)

例1)添字の下限が76、上限が85の1次元配列
 ARRAY yer{76:85} yer76-yer85 ;
例2)ARRAY box {1:5,1:3} x1-x15 ;

指定形式その3…アスタリスク(*)配列の要素数を、引数配列要素に指定された

変数の数から割り出す。(配列要素の指定が必須。多次元配列では指定できない。)

 $   :配列の要素がすべて文字であることを示す。
length  :配列要素の長さを指定。
配列要素 :配列に指定したい変数をブランクで区切って列挙。
       指定する変数の型はすべて同一でなければならない。

※下記のキーワード指定し、データステップ内で定義されたSAS変数を定義する。
_ALL_       全てのSAS変数(SAS変数の型が全て同一でなければならない。)
_NUMERIC_    全ての数値変数
_CHARACTER_  全ての文字変数

※要素数に数値を指定した場合、変数リストが省略できる。
 配列名のあとに1、2、…nがついた変数名を自動的に作成する。
_TEMPORARY_  一時変数からなる配列が定義(中間結果を保存するときに使用。)
            変数名を持たない。(値は配列名と添字によって参照される。)
            SASデータセットに書き出されない。
            データステップによるオブザベーションに対する反復処理の開始時に欠損値に初期化されない。
            要素数に*を指定した場合、_TEMPORARY_は指定できない。

初期値:初期値の区切りにはカンマの代わりにブランクも指定できる。
     配列要素に指定した変数の左から順に割り当てられる。
     初期値の値より、配列の要素の個数が多いときは、残りの配列要素に欠損値が入る。
     配列要素の属性(長さや型など)を指定していない場合、初期値の最初の値により、
     配列の全変数の属性が決定する。
例)
 ARRAY test1{3} t1 t2 t3 (90, 80, 70);   
 ARRAY test2{3} a1 a2 a3 ('a' 'b' 'c');
データ加工ver1とデータ加工ver2は同じ結果である。
/*テストデータ*/
data test1;
  do i=1 to 2 ;
    a=1;
    b=2;
    c=3;
    d=4;
    e=5;
    f=6;
    output;
  end;
run;
 
/*データ加工ver1*/
data test2_1;
  set test1;
  array box(3) x1-x3;
 
  box(1)=a;
  box(2)=b;
  box(3)=c;
  output;
 
  box(1)=d;
  box(2)=e;
  box(3)=f;
  output;
run;
 
/*データ加工ver2*/
data test2_2 ;
  set test1;
  array in (6) a b c d e f;
  array box(3) x1-x3;
 
    do i=1 to 3;
      if in(i) eq . then box(i) = .     ;
      else               box(i) = in(i) ;  
    end;
    output;
    do i=4 to 6;
      if in(i) eq . then box(i-3) = .     ;
      else               box(i-3) = in(i) ;
    end;
    output; 
run;


最終更新:2008年10月12日 23:46
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。