配列参照 ステートメント
処理する配列要素を記述します。
| 該当要素: | DATAステップ |
|---|---|
| カテゴリ: | CAS |
| In-Database処理 | |
| 情報 | |
| 種類: | 宣言 |
| 制限事項: | VARCHARデータタイプの変数はサポートされていません。 |
目次
構文
引数
array-name
同一のDATAステップ内でARRAYステートメントによってすでに定義されている配列名です。
{subscript}
subscript(添字)を指定します。次のいずれかの形式を使用できます。
{variable-1< , …variable-n>}
通常、DOループの処理で使用する変数または変数のリストを指定します。DOループの実行時ごとに、この変数の現在の値が処理される配列要素のsubscriptになります。
| ヒント | subscriptは中かっこ({})、大かっこ( [ ] )、丸かっこ(( ))で囲むことができます。 |
|---|---|
| 例 | 反復DOループ処理を使用する |
{*}
配列内の要素を変数リストとして強制的に処理するように指定します。
| 制限事項 | 一時配列要素を含む配列を定義する際、アスタリスクを使用して配列要素を参照することはできません。 |
|---|---|
| ヒント | アスタリスクは、INPUTステートメント、PUTステートメント、および一部のSAS関数で使用できます。 |
| この構文は処理を容易にするために提供されていますが、通常の配列処理では使用できません。 | |
| 例 | 変数リストとしてアスタリスクを使用する |
expression-1< , ...expression-n>
SAS式を指定します。
| 範囲 | 配列参照を含むステートメントの実行時、この式の値がsubscript値になります。また、この式の結果は、配列数の下限値と上限値の範囲内の整数になります。 |
|---|---|
| 例 | subscriptを指定する |
詳細
- プログラムステートメント内で配列を参照するには、配列参照を使用します。配列を定義するARRAYステートメントは、DATAステップ内でこの配列の参照箇所よりも前の位置に指定する必要があります。配列定義はDATAステップの実行時のみ有効です。複数のDATAステップで同じ配列を使用する場合、ステップごとに配列を再定義します。
注意
SAS関数の名前を配列名として使用すると、予期しない結果が生じることがあります。 関数名を誤って配列名として使用すると、DATAステップの実行時に、指定した名前を含むかっこ付きの参照名は関数の呼び出しではなく配列参照として解釈されます。この結果、警告メッセージがSASログに書き込まれます。
- 配列参照は、SAS関数やSASステートメントなどのSAS式を記述できるところであればどこにでも指定できます。
- 割り当てステートメント
- 合計ステートメント
- DO UNTIL(expression)
- DO WHILE(expression)
- IF
- INPUT
- PUT
- SELECT
- WINDOW
- 配列次元の下限値が1の場合、配列次元の要素数を返すために、DIM関数を反復DOステートメントと組み合わせてよく使用します。DIM関数を使用すると、DOステートメントの上限値を変更せずに配列要素の数を変更することができます。例えば、DIM(NEW)の結果として4が返されるため、これらのステートメントでは配列内のすべての要素を処理します。
array new{*} score1-score4; do i=1 to dim(new); new{i}=new{i}+10; end; - 配列の中に値が存在するかどうかは、IN演算子を使って判断することができます。次に例を示します。
data test; array v[3] (1 2 3); if 2 in v then flag = 5; run;
比較
ARRAYステートメントでは配列を定義しますが、配列参照では処理対象となる配列メンバーを定義します。
例
例1: 反復DOループ処理を使用する
この例では、DOループを繰り返す際、変数Iの値を配列参照のsubscriptとして使用して、配列の各要素を処理します。配列要素の値が99の場合、その値はIF-THENステートメントによって100に変更されます。
data test;
input d1 d2 d3 d4 d5 d6 d7;
datalines;
1 2 99 3 99 0 99
;
run;
data test;
set test;
array days{7} d1-d7;
do i=1 to 7;
if days{i}=99 then days{i}=100;
end;
put d1= d2= d3= d4= d5= d6= d7=;
run;
SASは次の出力をログに書き込みます。
d1=1 d2=2 d3=100 d4=3 d5=100 d6=0 d7=100
例2: 1つのステートメントで複数の配列を参照する
1つのSASステートメントで複数の配列を参照することができます。この例では、DAYSとHOURSという2つの配列を作成します。DOループ内のステートメントでは、この2つの配列にある配列要素を参照して変数Iの現在の値を置き換えます。
data test;
input d1 d2 d3 d4 d5 d6 d7;
datalines;
1 2 99 3 99 0 99
;
run;
data test;
set test;
array days{7} d1-d7;
array hours{7} h1-h7;
do i=1 to 7;
if days{i}=99 then days{i}=100;
hours{i}=days{i}*24;
end;
put d1= d2= d3= d4= d5= d6= d7=;
put h1= h2= h3= h4= h5= h6= h7=;
run;
SASは次の出力をログに書き込みます。
d1=1 d2=2 d3=100 d4=3 d5=100 d6=0 d7=100 h1=24 h2=48 h3=2400 h4=72 h5=2400 h6=0 h7=2400
例3: subscriptを指定する
この例では、INPUTステートメントを使用して、変数A1と変数A2、配列ARR1の3番目の要素(A3)を読み取ります。
data test;
array arr1{*} a1-a3;
x=1;
input a1 a2 arr1{x+2};
datalines;
1 2 3
;
run;
例4: 変数リストとしてアスタリスクを使用する
-
data test; input cost1 cost2 cost3 cost4 cost5 cost6 cost7 cost8 cost9 cost10; datalines; 10 20 30 40 50 60 70 80 90 100 ; run; data test; set test; array cost{10} cost1-cost10; totcost=sum(of cost {*}); put totcost=; run; -
data test; array days{7} d1-d7; input days {*}; datalines; 1 2 3 4 5 6 7 ; run; -
data test; input h1 h2 h3 h4 h5 h6 h7; datalines; 1 2 3 4 5 6 7 ; run; data test; set test; array hours{7} h1-h7; put hours {*}; run;
関連項目
-
Array Processing (SAS Language Reference: Concepts)
-
関数:
- DIM 関数 (SAS関数とCALLルーチン: リファレンス)
-
ステートメント: