본문 바로가기
Programming/SAS

[SAS 기초] Informat / Format

by Kanii 2022. 5. 26.
반응형

오늘은 SAS에서 데이터의 입력 형식과 출력 형식을 지정할 수 있는 Informat/Format 구문을 공부해보자.


1. Informat / Format

 

SAS에서는 변수를 처리할 때 단순히 숫자, 문자, 날짜의 형태로만 받아들이지않고, 굉장히 세부적으로 변수의 입력 형식, 출력 형식을 지정할 수 있다.

SAS엔 변수의 입/출력 형식을 지정하는 Informat-Format 구문이 존재한다. 두 구문의 용법과 차이는 다음과 같다.

INFORMAT : 데이터의 입력 형식을 지정하는 구문, DATA step에서만 사용할 수 있다.
(용법) INFORMAT var.name format;
FORMAT : 데이터의 출력 형식을 지정하는 구문, DATAPROC step에서 모두 사용할 수 있다.
(용법) FORMAT var.name format;

여기서 주의 할 점은 INFORMAT을 사용하여 데이터 입력 형식을 지정했다고해서, 그 형식으로 반드시 출력되는 것은 아니다.

SAS에서는 입력 형식과 출력 형식을 다르게 받아들이기 때문에, 각각 지정을 해주어야한다.

 

데이터의 입/출력 형식 지정은 숫자, 문자, 날짜에 따라 그 형식의 종류만 다를 뿐 구문 용법은 다 동일하므로, 

형식의 종류를 살펴보고, 간단한 사용 예제를 살펴 보겠다.

 

2. 숫자 형식

 

SAS에서 제공하는 숫자 형식은 6 종류가 있다.

 

형식 (x,y는 숫자)  설명
x. x의 자리수 만큼 정수 값만을 표시한다.
x.y 입력 값의 전체 길이를 x로 설정하고, y 자리 수만큼 소수로 표현한다.
BESTx. 소숫점(.)을 포함하여 입력 값의 x 만큼의 전체 길이로 표현한다.
COMMAx.y 입력값의 전체 길이를 x로 설정하고, y 자리 수만큼 소수로 표현한다.
또한, 정수 부분은 3자리마다 콤마(,)를 사용하여 숫자를 표현한다.
PERCENTx.y 주어진 값을 %로 표현한다.
입력값의 전체 길이를 x로 설정하고, y 자리 수만큼 소수로 설정하며, 
%의 길이가 3이기 때문에, 반드시 x는 3이상으로 설정되어야한다.
Zx.y 입력값의 전체 길이를 x로 설정하고, y 자리 수만큼 소수로 설정하며,
만약에 정수 부분이 x보다 길이가 짧다면, 남는 부분을 모두 0으로 채워서 출력한다.

 

해당 형식들을 사용한 예를 살펴보자.

첫 번째 예는 INFORMAT만을 사용하였을 때의 결과이다.

 

  data numeric;
  informat num1 4. num2 4.2 num3 BEST5. num4 COMMA14.2 num5 PERCENT.3 num6 Z7.2;
  input num1 num2 num3 num4 num5 num6;
  cards;
  123.123 123.123 324.5678 1234567.254 0.12345678 1.2
  ;
  run;
 
  proc print data = numeric; run;
  proc contents data= numeric; run;

numeric 데이터의 출력 결과
numeric 데이터의 입력 형식

numeric 데이터의 입력 형식 결과를 보면 num1~num6까지 우리가 INFORMAT 구문에서 지정한 형태로 올바르게 지정된 것을 확인 할 수 있지만, 출력 형식은 지정되지 않았기 때문에, 우리가 cards;를 통해 입력한 형태로 그대로 출력되는 것을 확인 할 수 있다.

 

출력 형태를 사전에 정의하고 싶다면 DATA step안에서 함께 사용하면 된다.

 

  data numeric;
  informat num1 10. num2 10.2 num3 BEST5. num4 COMMA14.2 num5 PERCENT.3 num6 Z7.2;
  input num1 num2 num3 num4 num5 num6;
  format num1 10. num2 10.2 num3 BEST5. num4 COMMA14.2 num5 PERCENT.3 num6 Z7.2;
  cards;
  123.123 123.123 324.5678 1234567.254 0.12345678 1.2
  ;
  run;
 
  proc print data = numeric; run;
  proc contents data=numeric; run;

DATA step에서 FORMAT을 사용하였기 때문에, 데이터의 출력 형식이 지정되어있는 것을 살펴볼 수 있다.

 

FORMAT 같은 경우는 PROC step에서도 사용이 가능한데 그 용법과 예는 다음과 같다.

 

  proc print data=numeric(keep=num1);
  var num1;
  format num1 Z10.1;
  run;

위에서 생성한 numeric 데이터에서 num1변수 = 123.123만 Z10.1의 형식으로 출력해보자.

DATA step에서 사전 정의한 출력 형식을 무시하고 (일시적으로) Z10.1의 형식으로 출력된 것을 확인 할 수 있다.


2. 문자 형식

 

SAS에서 문자 형식은 숫자처럼 여러 종류가 있지는 않고, 그저 길이를 지정해주는 방식으로 이루어진다.

문자형 변수의 길이를 지정해주는 방법은 다음과 같다.

 

형식 (n은 숫자) 설명
$n. 입력한 문자열을 n 자리수 만큼 표현한다.
한글은 한 글자당 2자리, 영어와 숫자는 1자리로 인식한다.
또한 숫자 n뒤에 반드시 마침표(.)를 찍어주어야한다.

 

간단한 예를 살펴보자.

  data character;
  informat chr $10.;
  input chr;
  cards;
  abcdefg
  ;
  run;
 
  proc print data=character;run;
  proc contents data=character;run;
  proc print data=character
  var chr;
  format chr $4.;
  run;

chracter 데이터 출력
chracter의 입력 형식
FORMAT chr $4.

3. 날짜 형식

 

SAS는 기본적으로 1960년 1월 1일을 숫자 0으로 기준 잡고, 날짜를 숫자처럼 읽는다.

SAS는 이 숫자를 다양한 형태의 날짜 포맷으로 나타낼 수 있다.

 

형식 (x,y는 숫자) 설명 (ex, 입력 값 1)
DATE7. 입력 값을 7자리 일월년으로 표현 - ex, 02JAN60
DATE9. 입력 값을 9자리 일월년으로 표현 - ex, 02JAN1960
YYMMDDx. 입력 값을 년-월-일로 표현, x는 10이하의 값만 허용됨 - ex, 1960-01-02
WEEKDATE. 입력 값을 요일, 월일, 연도로 표현 - ex. Saturday, January 2, 1960
WORDDATE. 입력 값을 월일, 연도로 표현 - ex, January 2, 1960
NLDATEx. 입력 값을 연월일로 표현, 설정한 자릿수 x에 따라 표현 방법이 달라진다.
x<20 - ex, 1960.01.02
x>=20 - ex, 1960년 01월 02일
YYMMNx. 입력값을 연도 월로 표현 - ex, 196001
MONYYx. 입력 값을 월 연도로 표현 - ex, JAN1960
YEARx. 입력 값의 연도를 표현 - ex, 1960
DATETIMEx.y. 입력 값을 일월년:시:분:초로 표현 - ex, 01JAN1960:00:00:01
TIMEx.y. 입력 값을 시:분:초로 표현 - ex, 0:00:01
HHMMx.y.  입력 값을 시:분으로 표현 - ex, 0:00
HOURx.y. 입력 값을 시간으로 표현 - ex, 0

 

날짜 포맷의 예를 살펴보자.

 

  data date;
  input date;
  cards;
  140
  ;
  run;
 
  DATA date2;
  set date;
  DATE7 = PUT(date,DATE7.);
  DATE9 = PUT(date,DATE9.);
  YYMMDD = PUT(date,YYMMDD10.);
  WEEKDATE = PUT(date,WEEKDATE.);
  WORDDATE = PUT(date,WORDDATE.);
  NLDATE = PUT(date,NLDATE14.);
  YYMMN = PUT(date,YYMMN9.);
  MONYY = PUT(date,MONYY7.);
  YEAR = PUT(date,YEAR10.);
  DATETIME = PUT(date,DATETIME20.);
  TIME = PUT(date,TIME10.);
  HHMM = PUT(date,HHMM10.);
  HOUR = PUT(date,HOUR10.);
  RUN;
 
  PROC PRINT DATA=date2;RUN;

날짜 FORMAT example

date2 데이터의 출력 값을 살펴보면, SAS는 숫자 140을 입력 값으로 주었을 때

1960년 1월 1일을 기준으로 140일이 지난 1960년 5월 20일로 날짜 인식을 하는 것을 확인 할 수 있다.

 

또한, 140을 시간의 형태로 나타내었을 땐, 해당 숫자의 단위를 '초'로 인식하기 때문에, TIME의 출력 결과가 0:02:20로 나타나는 것을 확인 할 수 있다.


오늘은 SAS에서 변수의 입/출력 형식의 종류와 사용 방법을 알아보았다.

이 글을 보는 누군가에게 도움이 되었기를 바란다!

반응형

댓글