포스팅 목차
o ARRAY 구문
1. 목 적
ARRAY 구문은 배열에서 사용하기 위한 배열 원소를 정의한다. ARRAY 구문은 그룹 단위로 처리하기 위한 변수(원소)의 집합을 정의하고, 배열 이름과 첨자를 사용(배열 참조 구문)하여 배열의 원소를 참조한다. 일반적으로 배열에서 다수의 원소를 처리하기 때문에, 배열은 DO 그룹과 함께 많이 사용된다.
2. 문 법
ARRAY array-name { subscript } <$><length> <array-elements> <(initial-value-list)>; |
1) Array-name
배열의 이름을 정의한다. 배열 이름은 동일한 데이터 스텝에서 사용되고 있는 변수 이름은 사용하면 안 된다.
제한사항 : | Array-name은 동일한 데이터 스텝에서 변수 이름으로 사용되지 않은 이름을 사용해야 한다. |
경고 : | SAS 함수 이름을 배열의 이름으로 사용 할 경우에는 예기하지 못한 결과가 발생된다. 만약 실수로 함수 이름을 배열의 이름으로 사용하였다면, SAS는 데이터 스텝 중에서 함수 이름이 포함된 삽입구 참조(parenthetical references)를 함수로 인식하여 처리 하지 않고 배열 참조로 처리한다. 그리고, 경고 메시지를 SAS 로그에 작성한다. |
2) {subscript}
별표(*), 숫자 또는 배열의 범위를 사용하여 배열의 원소 개수와 범위를 지정한다. Subscript는 다음 중에 하나의 형태로 지정할 수 있다.
(1) {dimension-size(s)}
배열의 각 차원에서 원소의 개수를 지정한다. 1-차원 배열에서는 원소의 개수를 표시하고, 다차원 배열에서는 각 차원에 대한 원소의 개수를 표시한다.
Tip : | 첨자는 대괄호({}), 중괄호([]) 또는 소괄호(()) 안에 위치 할 수 있다. |
예제 : | 1차원 배열은 다음과 같이 사용 할 수 있다. ARRAY SIMPLE{3} red green yellow; 이 ARRAY 구문은 3개의 변수(RED,GREEN,YELLOW)를 그룹화하는 SIMPLE 배열을 정의한다. |
예제 : | 1차원 이상의 배열은 다차원 배열이라고 하고, 다차원 배열에서는 차원의 개수를 포함 할 수 있다. 예제로, 아래의 이차원 배열은 배열 원소의 행과 열에 대한 정리 작업을 수행한다. 다음 문장은 5개 행과 3개 열로 구성되는 이차원 배열을 정의한다. XE "다차원 배열:ARRAY 구문" ARRAY x{5,3} SCORE1 – SCORE15; SAS는 배열의 좌측 상단을 시작하여서 모든 행을 우선적으로 차례로 채우기 시작하여 이차원 배열에 변수를 채운다. |
(2) {<lower:>upper<,…<lower:>upper>}
배열의 개별 차원에 대한 범위를 지정한다. Lower는 차원의 하한값이고, upper는 상한값이다.
범위 : | 대부분 명시적(explicit) 배열에서, 배열의 각 차원에서 첨자의 범위는 1에서 n까지이다. n은 차원에서 원소의 전체 개수이다. |
예제 : | 다음 예제에서 각 차원의 값은 기본적으로 개별 차원의 상한값이다. Array x{5,3} score1-score15; 대안으로, 다음 ARRAY 구문은 이전 예제와 동일한 프로그램이다. ARRAY X{1:5,1:3} SCORE1-SCORE15; |
Tip : | 일반적으로 대부분의 배열에서 1은 사용하기 편리한 기본 하한값이며, 이 경우에 하한과 상한 경계를 함께 지정할 필요가 없다. 그러나, 배열 차원의 하한값으로 1보다 큰 값을 사용 할 때에는 상한과 하한 경계값을 모두 지정하는 것이 유용하다. |
Tip : | 첨자에 대한 평가에 사용되는 계산 시간을 줄이기 위하여 0을 하한 경계로 사용하라. |
(3) {*}
배열에서 사용되는 변수의 개수를 자동으로 첨자로 정의하도록 지정한다. 별표를 지정하는 경우에는 array-elements를 함께 지정해야 한다.
제한사항 : | 임시 배열 또는 다차원 배열을 사용 할 때에는 별표를 함께 사용 할 수 없다. |
3) $
배열에서 원소를 문자 원소로 지정한다.
Tip : | 만약 원소가 이전에 문자 원소로 지정되었으면, 달러($) 표시를 지정 할 필요가 없다. |
4) Length
이전에 변수 길이가 할당되지 않은 경우에 배열 원소의 길이를 지정한다.
5) Array-elements
배열 원소의 이름을 지정한다. Array-elements는 모두 수치형이거나 모두 문자형으로 지정해야 하며, 순서는 임의로 나열할 수 있다. 원소는 다음 중에 하나가 될 수 있다.
(1) VARIABLES
변수 이름을 지정한다. 변수 이름은 ARRAY 구문에서 정의하기 위하여 기존에 존재하는 변수를 지정하거나 또는 배열 이름과 숫자를 조합하여 새롭게 생성되는 변수 중에 하나의 형태를 사용한다.
SAS 변수 리스트를 사용하여서 동일 데이터 스텝에서 이전에 정의된 여러 변수들을 한 번에 손쉽게 참조가 가능하다.
_NUMERIC_ : 데이터 스텝에 존재하는 모든 수치형 변수들을 참조.
_CHARACTER_ : 데이터 스텝에 존재하는 모든 문자형 변수들을 참조.
_ALL_ : 데이터 스텝에 존재하는 모든 변수들을 참조.
범위 : | 변수명은 ARRAY 구문에서 정의한 변수 또는 배열 이름과 숫자를 결합하여 생성되는 변수 중에 하나의 형태를 사용한다. 예를 들어, 첨자가 별표가 아니라 숫자를 사용한 경우에 배열에서 개별 변수를 지정할 필요는 없다. 대신 변수 이름을 지정하지 않은 경우에는 배열 이름과 숫자 1,2,3, …,n를 연결한 변수명을 자동으로 생성하여 사용한다. |
Tip : | 아래 SAS 변수 리스트는 동일 데이터 스텝에서 이전에 정의된 다수의 변수들을 손쉽게 참조가 가능하다. _NUMERIC_ : 모든 수치형 변수들을 참조. _CHARACTER_ : 모든 문자형 변수들을 참조. _ALL_ : 모든 변수들을 참조. |
제한사항 : | 만약 변수 리스트 _ALL_을 사용하는 경우 이전에 정의된 모든 변수들은 동일한 변수 형태이어야 한다. |
주요기능 : | 예제1 : 배열을 정의하는 방법 |
(2) TEMPORARY
임시 데이터 원소의 리스트를 생성한다. 임시 데이터 원소로는 수치형 또는 문자형 속성을 사용할 수 있다. 임시 배열에서는 사용되는 변수의 이름을 지정하지 않고, 배열 이름과 차원을 사용하여 임시 데이터 원소를 참조하며, 출력 데이터 세트에는 임시 배열에서 생성된 변수들은 출력하지 않는다.
범위 : | 임시 데이터 원소로는 수치형 또는 문자형 속성을 사용 할 수 있다. |
Tip : | 임시 데이터 원소들은 다음 내용을 제외하고 데이터 스텝의 변수와 동일하게 행동한다. - 임시 배열에서는 사용되는 변수의 이름을 지정하지 않는다. 배열 이름과 차원을 사용하여 임시 데이터 원소를 참조한다. - 출력 데이터 세트에는 임시 배열에서 생성된 변수들을 출력하지 않는다. - 일반적으로 모든 원소를 참조하기 위하여 사용되는 특수한 첨자 별표(*)를 사용 할 수 없다. - 임시 배열에서 사용되는 관측값은 데이터 스텝의 다음 차례의 반복을 시작 하는 시점에 결측값으로 초기화되지 않고, 임시 데이터 원소 값들은 항상 자동적으로 유지(RETAIN)된다. |
Tip : | 임시 배열은 배열 처리로 특정 계산 작업을 수행하는 경우에 유용하다. 배열 처리의 결과를 출력하기 위해서 결과를 변수에 할당하라. 배열 처리 결과를 출력 데이터 세트에 저장하지 않기 때문에, 임시 데이터 원소 사용으로 수행 시간을 단축 시킬 수 있다. |
6) (initial-value-list)
배열에서 해당 원소에 초기값을 부여한다. 원소의 값으로는 숫자 또는 문자열을 지정할 수 있고, 모든 문자열은 따옴표 안에 작성해야 한다. 직접 다수의 초기값을 지정하기 위하여 다음 형태를 사용할 수 있다.
- (initial-value(s))
반복 인자와 중첩된 하위 리스트를 사용하여 초기값을 지정하기 위하여 다음 형태를 사용할 수 있다.
- <constant-iter-vlue*><(>constant value | constant-sublist<)>
- constant-iter-vlue : 반복 인자
- constant value : 상수값
- constant-sublist : 상수 리스트
제한사항 : | 만약 initial-value-list와 array-elements 양쪽을 함께 지정하는 경우에 ARRAY 구문에서 배열 구성요소(array-elements)는 초기값 리스트(initial-value-list) 앞쪽에 작성되어야 한다. |
Tip : | 변수와 임시 데이터 원소에 초기값을 지정 할 수 있다. |
Tip : | 배열 원소와 초기값은 위치로 매칭되고, 만약 초기값보다 더 많은 배열 원소가 존재하는 경우에 나머지 배열 원소에는 결측값이 할당되고 경고 메시지가 출력된다. |
주요기능 : | 예제2 : 초기값으로 수치형 값 지정 예제3 : 초기값으로 문자형 값 지정 |
Tip : | 초기값 리스트에서 초기값은 쉼표 또는 공백으로 구분된다. |
Tip : | 순차적으로 정수의 범위 지정을 위해 단축 표현을 사용 할 수 있고, 증가값은 항상 +1이다. |
Tip : | 배열 원소의 속성(길이와 형태 등)을 이전에 정의하지 않았으면, 지정한 초기값의 속성이 대응되는 배열 원소의 속성으로 자동적으로 할당된다. 참고 : 초기값은 새로운 값이 배열 원소에 할당되기 전까지 유지(Retain)된다. |
Tip : | 일부 원소 또는 모든 원소에 초기값이 할당 될 때, 모든 원소는 RETAIN 구문에 할당된 것과 동일하게 행동한다. |
예제 : | 다음은 반복 인자와 중첩된 하위리스트를 사용하는 예제이다. 다음 ARRAY 구문은 모두 동일한 초기값을 지정하는 리스트이다. - ARRAY X{10} X1-X10 (10*5); - ARRAY X{10} X1-X10 (5*(5 5)); - ARRAY X{10} X1-X10 (5 5 3*(5 5) 5 5); - ARRAY X{10} X1-X10 (2*(5 5) 5 5 2*(5 5)); - ARRAY X{10} X1-X10 (2*(5 2*(5 5))); |
3. 상세 설명
ARRAY 구문은 그룹 단위로 처리하기 위한 원소(변수)의 집합을 정의하고, 배열이름과 첨자를 사용하여 배열의 원소를 참조한다. 일반적으로 배열에서 다수의 원소를 처리하기 때문에, 배열은 일반적으로 DO 그룹을 사용하여 참조된다.
4. 비 교 사항
- SAS 의 배열은 대다수 다른 컴퓨터 언어의 배열과 차이가 있다. SAS의 배열은 일시적으로 다수의 변수를 그룹화 하여 처리하는 단순하고 편리한 방법이다. SAS의 배열은 데이터 구조가 아니고, array-name은 변수가 아니다.
- ARRAY 구문은 배열을 정의하고, 배열 참조(array reference)는 프로그램 문장에서 배열 원소를 직접 사용한다.
5. 관련 구문
구문명 | 구문내용 |
ARRAY 구문 | 배열에서 사용하기 위한 배열 원소를 정의한다. |
배열 참조 구문 | 배열 구문에서 정의한 배열의 원소를 처리하기 위하여 참조하는 방법을 지정한다. |
DO 구문 | 그룹 단위로 실행하기 위한 SAS 문장의 그룹을 지정하라. |
DO 반복 구문 | 인덱스 변수의 값에 따라서 DO 구문과 END 구문 사이에 작성한 구문을 반복하여서 실행한다. |
DO UNTIL 구문 | 지정한 조건식이 참이 될 때까지 반복적으로 DO 반복문 안의 문장을 실행한다. |
DO WHILE 구문 | 지정한 조건식이 참일 동안에 반복적으로 DO 반복문 안의 문장을 실행한다. |
GO TO 구문 | label 인수에서 지정된 LABEL 구문으로 프로그램을 이동하여서 계속 처리한다. |
6. 예 제
배열을 정의하는 방법
SAS Statements |
array rain {5} janr febr marr aprr mayr;
array days{7} d1-d7;
array month{*} jan feb jul oct nov;
array x{*} _NUMERIC_;
array qbx{10};
array meal{3};
예제2 : 초기값으로 수치형 값 지정
SAS Statements |
array test{4} t1 t2 t3 t4 (90 80 70 70);
array test{4} t1-t4 (90 80 2*70);
array test{4} _TEMPORARY_ (90 80 70 70);
예제3 : 초기값으로 문자형 값 지정
SAS Statements |
array test2{*} $ a1 a2 a3 ('a','b','c');
예제4 : 다양한 고급 배열 정의 방법
SAS Statements |
array new{2:5} green jacobs denato fetzer;
array x{5,3} score1-score15;
array test{3:4,3:7} test1-test10;
array temp{0:999} _TEMPORARY_;
array x{10} (2*1:5);
예제5 : 첫 부분에 0을 포함하는 형태의 변수명을 범위를 지정하여서 생성하기
다음 예제는 첫 부분에 0을 포함하는 변수 이름 형태의 범위로 변수 이름을 지정하는 방법을 보여준다. 개별 변수 이름은 3자리 문자의 길이를 가지고, 변수 이름은 순차적으로 정렬된다.(A01, A02, ….A10).
첫 부분에 0을 포함하지 않으면, 변수 이름은 다음과 같은 순서로 정렬된다. : A1,A10,A2, …A9.
SAS Statements |
options pageno=1 nodate ps=64 ls=80;
data test (drop=i);
array a(10) A01-A10;
do i=1 to 10;
a(i)=i;
end;
run;
proc print noobs data=test;
run;
Results |
Array Names That Have Leading Zeros
The SAS System
A01 A02 A03 A04 A05 A06 A07 A08 A09 A10
1 2 3 4 5 6 7 8 9 10
[SAS Statement] SAS 데이터 스텝 구문 사전 목록] |
SAS 함수(SAS Function) 리스트 링크 |
'SAS > SAS 구문사전' 카테고리의 다른 글
[SAS Statement] CARDS 구문 (0) | 2022.01.25 |
---|---|
[SAS Statement] CALL 구문 (0) | 2022.01.25 |
【SAS Statement】 BY 구문 (0) | 2022.01.25 |
【SAS Statement】 ATTRIB 구문 (0) | 2022.01.25 |
【SAS Statement】 ABORT 구문 (0) | 2022.01.25 |
댓글