이번 게시글은 데이터 입력 단계의 기본적인 내용을 추가하여 사용할 수 있는 몇 가지 중요한 명령문들을 살펴볼 것입니다.
이러한 명령문들은 자룟값을 변환시키거나 새로운 변수의 생성 등을 통해 사용자의 목적에 맞는 데이터셋을 만들기 위해 사용됩니다.
사용자는 아래와 같은 형식의 할당문(assignment statement)를 이용하여 자룟값을 바꾸거나 새로운 변수를 생성할 수 있습니다 .
Variable = Expressions;
여기서 등호 왼쪽의 변수 이름(Variable)에는 기존의 변수 또는 새로운 변수 이름을 사용할 수 있고, 등호 오른쪽의 표현식(Expression)에는 아래의 예제와 같이 사칙연산을 포함한 여러 가지 형태의 표현식을 사용할 수 있습니다.
DATA WORK.EXAM;
INPUT ID $ NAME $ MID FINAL;
CARDS;
001 김철수 10 40
002 이영희 15 10
001 강민호 50 15
001 박지수 20 .
;
RUN;
DATA WORK.EXAM1;
SET WORK.EXAM;
X = 30;
MAJOR = '통계학';
MAJOR_ID = 'STA' || ID;
MEAN = (MID + FINAL) /2;
Y = MID **3;
LABEL NAME = '이름' MID = '중간성적' FINAL = '기말성적';
RUN;
SAS에서는 문자열(character string)은 인용부호(' ')로 문자열의 좌우를 닫아 변수 이름과 구별해 주어야 합니다.
또한, 연결 연산자(||, concatenation operator)는 여러 개의 문자열과 문자변수들을 연결하는 연산자입니다. 이때 문자열 또는 문자변수에 포함되어 있는 공백문자가 제거되지 않으면 공백문자를 제거하기 위해서는 TRIM 함수를 사용하면 됩니다.
LABEL 명령문은 각 변수에 레이블(변수에 대한 설명)을 붙여 주는 것으로써, 이와 같이 변수에 레이블을 붙여주면 이 후의 프로시저를 사용할 때 그 변수 이름 대신 레이블을 출력할 수 있습니다.
수학연산, 통계연산, 문자조정, 난수발생 등과 같이 다양한 기능을 가지는 약 150개의 함수가 등록되어 있습니다.
따라서 이들 함수를 이용하면 복잡한 연산을 간단히 수행할 수 있습니다.
● IF-THEN 명령문
어떤 할당문을 모든 개체에 적용하는 대신 특정 조건에 부합하는 개체에 대해서만 사용하고자 하는 경우가 종종 있습니다. 이와 같은 경우에는 다음과 같은 형식의 IF-THEN 명령문을 이용하여 원하는 작업을 수행할 수 있습니다.
IF condition THEN action;
여기서 condition은 조건 논리식을 표현하는 것이고, action은 조건식이 참(true) 인 경우에만 수행되는 할당문을 표현하는 것입니다.
DATA WORK.EXAM2;
SET WORK.EXAM;
IF FINAL = . THEN FINAN = 10;
IF (MID + FINAL) >= 50 THEN SCORE1 = 'P';
IF MID >= 30 OR FINAL >= 30 THEN SCORE2 = 'P';
IF SCORE1 = ' ' THEN
DO;
SCORE1 = 'F';
SOCRE2 = 'F';
END;
RUN;
위의 예제에는 4개의 IF - THEN 명령문이 포함되어 있습니다. 이와 같은 조건식에는 대부분 비교연산자(comparison operator)가 사용되는데, IF - THEN 명령문은 아래와 같이 작성할 수 있습니다.
IF final EQ.
THEN final = 10;
이와 같은 비교연산자와 함께 AND와 OR 연산자를 이용하여 다중 조건식을 사용할 수 있습니다.
또한, DO - END 명령문을 함께 사용하면 하나의 조건식에 대해 여러 개의 할당문을 동시에 지정할 수 있습니다.
● IN 명령문
DATA WORK.EXAM3;
SET WORK.EXAM;
IF MID IN (10 15) THEN SCORE1 = 'C';
IF MID IN (20,50) THEN SCORE1 = 'B';
IF NAME IN('이영희', '박지수') THEN SEX = 'F';
IF NAME IN('김철수', '강민호') THEN SEX = 'M';
RUN;
WHERE 명령문에서도 사용될 수 있는 IN 명령어에는 IF 조건문에 여러 개의 자료값을 나열할 때 매우 유용하게 사용됩니다.
IN 명령어는 사용할 때는 콤마(,) 또는 하나 이상의 공백으로 구분하여 자룟값을 나열하면 되는데, 이 때 문자변수에 대해서는 각 문자열을 인용부호 (' ')로 닫아주어야 합니다.
예를 들어, 첫번째 IF 명령문은 다음과 같은 동일한 작업을 수행하게 되므로
IF mid = 10 OR mid = 15 THEN score1 = 'C';
나열해야할 자룟값이 많은 경우엔 IN 명령어를 사용하는 것이 OR로 나열하는 것보다 훨씬 효율적입니다.
● IF - THEN - ELSE
IF - THEN 명령문에 ELSE 명령문을 함께 사용하면 프로그램을 보다 효율적으로 작성할 수가 있는데, ELSE 명령문은 바로 위에 있는 조건식이 참이 아닌 경우에만 수행됩니다.
DATA WORK.EXAM4;
SET WORK.EXAM;
IF MID >= 30 THEN SCORE1 = 'A';
ELSE IF MID >= 20 THEN SCORE1 = 'B';
ELSE SCORE1 = 'C';
IF FINAL >= 30 THEN SCORE2 = 'P';
ELSE SCORE2 = 'F';
RUN;
위의 예제에서는 SCORE1에 대해서
1) MID >= 30이면 A
2) (1) 이 참이 아니면 MID >= 20 이면 B
3) (1)과 (2) 가 모두 참이 아니면 C
● DELETE
IF 명령문과 DELETE 명령문을 함께 사용한다면 특정한 조건에 맞는 데이터만 제거하는 작업을 쉽
게 수행할 수 있습니다.
DATA WORK.PERSON1;
SET WORK.PERSON;
IF DEPT = 'MATH' OR DEPT = 'ECON' THEN DELETE;
RUN;
위의 예제에서는 변수 DEPT 값이 MATH 이거나 ECON 인 데이터를 모두 제거하고 데이터셋을 생성합니다. 한편 다음과 같이 THEN 명령어를 사용하지 않고 IF 명령문을 사용하면
IF dept = 'stat';
데이터셋에 저장하고자 하는 데이터만 골라낼 수 있습니다. 위의 명령문은 dept의 값이 stat인 데이터만 저장하는 명령문입니다.
SAS 데이터셋에서 변수는 3가지 형태 - 숫자형, 문자형, 날짜형으로 구분됩니다.
변수가 어떠한 형태를 가지느냐에 따라서 각 변수를 처리하는 방법과 사용할 수 있는 함수 등이 다릅니다.
날짜형 입력포맷으로 자룟값을 읽으면 1960년 1월 1일을 기준으로 그 때부터 날수로 바꾸어서 데이터셋에 저장합니다.
예를 들어, 1961년 1월 1일은 366이라는 숫자로 바꾸어 저장되고, 1959년 1월 1일은 -365 로 저장됩니다. 이와 같은 날짜변수에는 일반적인 산술연산식을 사용할 수 있을 뿐 아니라 다양한 형태의 날짜함수를 사용할 수 있으므로 매우 편리합니다.
DATA WORK.HIRE;
INPUT NAME $6. +1 BDATE DATE7. +1 HIRED MMDDYY8.;
HIREDATE = HIRED + (365.25*3);
HIREQTR = QTR(HIREDATE);
IF HIRED > '01JAN94'D THEN NEW = 'YES';
FORMAT BDATE MMDDYY8. HIRED YYMMDD8. HIREDATE WEEKDATE17.;
CARDS;
김철수 01jan60 09-15-90
최민지 05oct49 01-24-92
이영희 18mar88 10-10-93
오인수 29feb80 05-29-94
;
RUN;
DATE7. 와 MMDDYY8. 이라는 입력포맷으로 두 변수 BDATE 와 HIRED를 읽어들이고 있으며 산술연산식에 의해 변수 HIRED 에 3년을 더하여 변수 HIREDATE를 생성하고 설명한 날짜변수 QTR을 이용해 변수 HIREQTRㅇ르 생성합니다.
한편 날짜변수에 비교연산식을 사용하기 위해서는 날짜상수(DATE CONSTANT)를 사용해야 하는데, 날짜 상수는 'DDMMYY'D 형태로 지정해 주어야 합니다.
숫자화되어 저장되어 있는 날짜변수를 사용자가 보기 편한 형태의 날짜형식으로 출력하거나 보기 위해섯 FORMAT 명령문에 의해 각 날짜변수의 출력포맷을 지정해 주어야 합니다.
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.