1. 문자변수와 LENGTH 명령문
LENGTH 명령문은 선언문으로써 SAS 데이터셋에 변수가 저장될 때 사용되는 바이트(BYTE) 수를 지정해 줍니다. LENGTH 명령문을 사용할 때 조심할 점은 LENGTH 명령문이 변수의 길이(자릿수)를 지정하는 것이 아니라는 점입니다. 따라서 소수점을 가지는 숫자변수에 대해서는 바이트 수를 숫자변수일 때의 디폴트(default)인 8 바이트보다 작게 지정하는 것을 피해야 합니다.
만약 숫자변수에 대해서 바이트 수를 8바이트 보다 작게 하면 자룟값이 정확하게 저장되지 않을 수 있습니다.
한편 문자변수에 대해서는 SAS가 영문 한 글자는 1바이트, 한글 한 글자는 2바이트로 저장하기 때문에, LENGTH 명령문은 길이를 지정하는 것과 동일하게 됩니다. LENGTH 명령문은 나열된 변수의 순서에 따라서 변수가 저장되는 순서를 지정하는 기능도 가지고 있으며, 일반적인 사용벅은 다음과 같습니다.
LENGTH variable <$> length ... ;
여기서 $ 는 변수가 문자형임을 지정하는 옵션입니다.
length 는 바이트 수로써 숫자형에 대해서는 2에서 8까지 문자형에 대해서는 1에서 32.767까지 지정할 수 있습니다. ( * 운영체제에 따라 다를 수 있습니다.)
LENGTH 명령문은 자료를 읽는 동안에는 어떠한 영향도 주지 않으며 프로그램에서 LENGTH 명령문은 다음에 나타나는 변수에만 영향을 줍니다.
DATA WORK.LENGTH;
LENGTH NAME $ 9 GRADE $ 6;
INPUT NAME $ SCORE;
IF 1<= SCORE<=3 THEN GRADE = 'LOW';
ELSE IF 4<=SCORE<=7 THEN GRADE = 'MIDDLE';
ELSE IF 8<=SCORE<=10 THEN GRADE='HIGH';
CARDS;
HyunCheol 7
YongChan 10
MinHee 3
;
RUN;
위의 예에서 볼 수 있듯이 만약 LENGTH 명령문에 의해서 변수의 길이가 미리 지정되어 있지 않으면 INPUT 명령문에서 지정된 변수 NAME 에 대해서는 디폴트인 8이 길이가 되고, GRADE에 대해서는 이 변수의 값으로 처음 나타나는 LOW에 의해서 길이가 3이 됩니다. 그리고 LENGTH 명령문이 사용된 경우에는 LENGTH 명령문에 의해서 지정된 변수가 지정된 변수가 저장될 때 데이터셋의 앞쪽에 저장되는 것을 볼 수 있습니다.
2. RETAIN 명령문
데이터 단계의 수행시 SAS 각 레코드(RECORD)의 자룟값들을 읽은 후에 데이터 단계에 주어진 명령문들을 수행하며 각 매체를 하나씩 차례로 생성해 나갑니다. 이러한 데이터 단계어세 각 개체를 생성하기에 앞서 사용자가 특별히 명시를 하지 않으면, SAS는 숫자변수에는 결측값을 그리고 문자변수에는 공백으로 고정시켜 놓고 시작합니다.
그러지만 사용자가 이와 같은 처리를 원하지 않고 어떤 변수의 값을 바로 전 단계에서의 값으로 유지시키고자 한다면 그 변수의 이름을 RETAIN 명령문으로 지정하여 프로그램을 수행시키면 됩니다. 일반적으로 SAS의 연산은 단위 개체 내의 변수에 대해서만 이루어지기 때문에 개체 간의 연산이 쉽지 않다고 할 수 있는데, RETAIN 명령문은 이와 같은 개체 간의 자룟값을 비교나 연산에서 유용하게 사용됩니다.
RETAIN 명령문의 일반적 사용형식은 다음과 같습니다.
RETAIN variable-1 [initial-value-1] ... ;
이때 특별한 지정이 없으면 RETIAN 명령문에 지정된 변수는 숫자변수가 됩니다. 문자변수로 지정하고자 할 때는 적절한 길이의 문자형 초깃값을 지정하거나 앞절에서 설명한 LENGTH 명령문으로 문자변수의 길이를 사전에 지정해야 합니다. 변수의 초깃값을 지정하지 않으면 초깃값은 결측값이 됩니다.
DATA WORK.CARE;
INPUT NAME $ X @@;
RETAIN MAX_X 0 Y 0 OLDNAME '***';
MAX_X = MAX(MAX_X,X);
Y=Y+X*X;
IF NAME=OLDNAME THEN CASE='OLD';
ELSE CASE = 'NEW';
OLDNAME = NAME;
DROP OLDNAME;
CARDS;
AAA 1 BBB 4 BBB 8 BBB 3
CCC 2 CCC 5 DDD 6
;
RUN;
위의 예에서는 다양한 형태의 RETAIN 명령문의 사용 예를 보여주고 있습니다. 먼저 변수 MAX_X 에 대해서는 MAX 함수를 이용하여 변수 X의 자룟값들 중 가장 큰 값을 계속 저장해 나가는 것이며,
변수 Y는 누적 제곱합을 계산합니다. 변수 CASE는 변수 NAME 의 이전 자룟값과 현재 자룟값을 비교하여 새로운 자룟값에는 'NEW'를 그리고 이전 자룟값과 같으면 'OLD' 라는 자룟값을 자기게 한 것입니다.
한편 단순히 한 수식에서의 누적합을 구하고자 할 때는 RETAIN 명령문에 유지될 변수를 지정하지 않고 함수 RETIAN 을 사용할 수도 있는데, 예를들어 프로그램 중 누적제곱합을 할당문 'Y=Y+X*X'는 다음과 같이 작성해도 동일한 작업을 수행할 수 있습니다.
사용된 DROP 명령문은 데이터셋에 저장하지 않고 제거할 변수를 지정할 때 사용되는 선언문입니다.
Y + X*X;
여기서 변수 Y는 누적결과를 보유하고 숫자변수이고, X*X 는 제곱을 나타내는 SAS 표현식입니다.
이와 같은 함축 RETAIN 은 숫자변수에 대해서만 사용할 수 있으며, 변수의 초깃값으로는 0을 가집니다.
즉, 다음과 같이 RETAIN 명령문과 SUM 함수를 함께 사용하는 것과 동일합니다.
RETAIN y 0;
y = SUM(y,x*x);
3. ARRAY 명령문
ARRAY 명령문은 일련의 변수들은 배열(ARRAY) 의 원소들로 지정하는 것으로 여러 개의 변수들에대해서 동일한 작업을 반복할 필요가 있을 때 ARRAY 명령문과 DO-END 명령문을 함께 이용하면 효율적으로 작업을 수행할 수 있습니다.
SAS 에서 ARRAY 명령문의 사용은 일반적인 프로그래밍 언어에서의 배열 지정과 개념적으로 유사하며, ARRAY 문의 일반적 형식과 사용법은 다음과 같습니다.
ARRAY name {#} <$> variable-list;
DATA WORK.TSCORE;
INPUT NAME $ MATH STAT ENG KOR ART;
ARRAY TSCORE [5] MATH STAT ENG KOR ART;
DO I = 1 TO 5;
IF TSCORE(I) = 9 THEN TSCORE(I)=.;
END;
CARDS;
김철수 5 5 1 2 1
최민지 9 3 1 4 5
이영희 1 5 3 2 9
오인수 4 1 2 4 9
;
RUN;
다섯 개의 변수 MATH, ... , ART는 ARRAY 명령문에 의해 TSCORE라는 배열의 원소로 지정되며, 이 배열에 포함된 어느 변수의 자룟값이 9가 되면 이를 결측값으로 바꾸고 있습니다.
4. 기타 명령문들
1) 논리문
논리문은 표현식이 참이면 1, 거짓이면 0을 가지게 되는 일종의 조건식입니다.
예를 들어, 아래의 예제에서 각 괄호 안의 논리문은 그 안의 내용이 사실이면 1, 그렇지 않으면 0이 되며 변수 GROUP 에는 각 논리문의 0과 1들의 합계가 기억됩니다.
DATA LOGICAL;
INPUT AGE PATH;
GROUP = (AGE GT 0) +(AGE<=35);
IF PATH THEN DEPT = 'STAT';
CARDS;
...
자룟값이 1 또는 0을 가지는 변수에 대해서는 IF 명령문을 위의 예제에서와 같이 사용할 수 있는데, 이번 예제에서는 변수 PATH 자룟값이 1인 데이터에 대해서만 변수 DEPT 가 자룟값 STAT을 가지게 됩니다.
2) LIST 명령문
현재 처리되고 있는 개체에 대한 입력 데이터를 LOG 윈도우에 출력합니다.
DATA LIST;
INPUT TRT CROP HERB;
IF TRT = . THEN LIST;
...
3) RETURN 명령문
이 명령문은 현재 처리되고 있는 개체에 대해 그 이후의 작업을 수행하지 않고 데이터 - 단계의 처음으로 돌아가서 다음 개체에 대한 작업을 수행하고자 할 때 사용됩니다.
이번 예제에서는 두 변수 X와 Y의 자룟값이 같은 개체에 대해서는 그 이후의 연산은 수행되지 않습니다. 사실 모든 데이터 - 단계에서는 제일 마지막 명령문 RETURN 명령문이 있는 것처럼 생각할 수 있습니다.
DATA RETURN;
INPUT X Y Z;
IF X=Y THEN RETURN;
X=Y+Z;
XSQURE = X*X;
CARDS;
...
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Early bird rate extended! Save $200 when you sign up by March 31.