BookmarkSubscribeRSS Feed

[SAS 활용 노하우] 데이터 입력하기 part1

Started ‎07-16-2021 by
Modified ‎07-16-2021 by
Views 7,126

 

SAS를 잘 활용하려면 데이터를 원활하게 읽고 처리할 수 있어야 합니다.

SAS는 다양한 형태의 데이터를 효율적으로 처리할 수 있는 기능이 있습니다.

데이터를 읽어 들이는 단계를 DATA 단계라고 하는데, DATA 문장으로 시작하여 RUN 문장으로 이루어집니다. DATA 단계에는 원시자료 입력, 자료구조의 변환 등으로 구성되며 이번 게시글은 DATA 단계에서 데이터를 입력하고 구조를 변경하는 방법 등을 예제 프로그램을 이용하여 알아보려 합니다.

 

 

 

1. 자료입력

DATA 단계에서 자료가 입력되는 유형은 크게 2가지 입니다.

 

 

1) 프로그램에 직접 자료를 입력

2) 외부 파일 자료 읽기

프로그램에 직접 자료를 입력하는 첫 번째 경우는 직접 원시 자료(raw data)를 입력하는 경우로 자료가 크지 않은 경우에는 이런식으로 처리해도 무방합니다. Input문장과 Datalines 문장(또는 Cards 문장)의 사용이 수반됩니다.

두 번째 경우에는 외부 파일이 따로 저장되어 있어 데이터 파일을 읽어들이는 경우를 의미합니다.

 

 

1.1 DATA 문장

 

DATA 문장은 SAS 프로그램에서 DATA 단계의 시작을 알리는 문장으로 어떤 DATA 단계라도 반드시 DATA 문장으로 시작합니다.

 

DATA SASdataset;

 

사용형식에서 SASdataset은 DATA 단계의 결과로 생성되는 SAS 자료의 이름으로 변수이름은 짓는 규약에 준수하여 마음대로 사용자 마음대로 정하면 됩니다.

 

/* #1 */
data class;
     input name $ number gender $ dept $ exam1 exam2;
datalines;
minyoung 1 f stat 50 50
minji 2 f computer 50 50
kongjui 6 f computer 20 40
patjui 3 f stat 20 45
heungboo 5 m computer 25 25
nolboo 4 m stat 29 28
run;

/* #2 */
data new;
	set class;
	scre = exam1 + exam2;
run;

/* #3 */
data new;
	set new;
	average = score/2;
run;

 #1. data 입력 단계를 실행하기 위해 class에는 name, number, gender, dept, exam1, exam2의 변수 6개가 입력되었습니다.

 

#2. data 입력 단계에서 SAS 자료 class에 score란 변수 하나가 더 추가된 새로운 SAS 자료 new를 만들었습니다. SAS 자료 new에는 name, number, gender, dept, exam1, exam2, score의 변수 7개가 포함됩니다.

 

#3. '#2'에서 만든 자료 new를 다시 읽어 두 개의 시험 성적의 평균을 계산하였습니다. 그리고 이 결과를 전과 같이 new 라는 이름의 자료로 저장하였습니다. 그래서 '#2'에서 만든 자료는 없어졌습니다.

 

따라서 위 프로그램이 실행되면 컴퓨터 메모리에는 class와 new의 두 자료가 존재하게 됩니다.

 

INPUT specification;

 

 

specification은 자료의 입력형식을 의미합니다.

지원하는 데이터 입력방식에는 3가지가 있습니다.

 

1) 자유입력 (free input) , 목록입력 (list input)

2) 열 입력 (column input)

3) 포맷 입력 (formatted input)

 

 

문자변수를 입력할 때는 항상 '$'를 변수 이름 뒤에 붙여야 합니다. '$'는 Input문장에서만 사용됩니다.

 

 

 

1) 자유입력 (free input) , 목록입력 (list input)

 

INPUT lastname $ age height weight children;

  

주어진 자료를 자유입력 방식으로 읽으려면 다음과 같이 변수이름만 순서대로 나열합니다.

자유입력 방식은 각 데이터값 사이에 적어도 하나의 빈칸이 존재하는 경우에 쓸 수 있으며, 이 조건이 만족되는 경우 가장 간편한 입력방식입니다. 즉, 몇 번째 열부터 원하는 데이터 값이 시작되는지 전혀 상관할 필요가 없습니다. 문자 데이터 값을 읽을 때 데이터 값의 길이가 8자를 넘으면 가장 앞의 8자만 입력됩니다. 이런 경우를 피하려면 열입력이나 포맷입력을 선택합니다.

 

 

 

2) 열입력

 

열입력 방식은 각 변수가 입력되는 열의 범위를 지정하는 입력방식입니다. 즉, 입력될 변수의 시작 열과 끝 열의 번호를 명시하고 그 사이여 줄표(dash)를 삽입합니다.

 

INPUT lastname $ 1-15 age 16-17 height 20-22 weight 25-26 children 30;

 

위의 예를 살펴보면 'lastname' 변수는 15칸을 잡았습니다. 또한 'children' 변수는 1칸으로 잡았습니다. 

 

 

3) 포맷입력

 

포맷입력 방식은 일반 컴퓨터 언어에서 사용 되는 것과 같은 형식의 포맷을 지정하여 자료를 입력하는 방식입니다.

 

INPUT lastname $char15. age 2. height 5. weight 5. children 4. ;

 

이 문장이 실행되면 처음 15칸은 lastname에, 그 다음 2칸은 age, 그 다음 5칸은 height, 그 다음 칸은 weight, 그 다음 4칸은 children에 배정됩니다. lastname은 15자리의 문자데이터, age는 두 자리의 소수점 아래가 없는 숫자 데이터, height는 5자리의 숫자 데이터로 입력됩니다.

 

 

 

4) 혼용

 

앞에서 소개한 3가지 입력방식의 혼용도 가능합니다. 다음은 자유입력, 열입력, 포맷입력이 모두 혼용되는 예입니다.

 

INPUT lastname $ age 16-17 height 5. weight 4. children 30;

 

 위의 예를 보시면, lastname은 자유입력, age와 children은 열입력, height와 weight는 포맷입력이 됩니다.

 

 

 

1.3 포인터

 

실제 통계조사를 통해 얻은 자료를 입력하다 보면 하나의 데이터가 두 줄 이상을 차지하는 경우도 자주 접하게 됩니다. 여러 줄에 걸쳐 있는 관측 중 일부의 데이터값만 골라서 입력해야 할 경우도 생깁니다.

구조가 복잡한 자료를 효율적으로 입력하려면 포인터(pointer)의 개념을 잘 이해해야 합니다. 포인터는 읽을 지점 또는 입력이 시작되는 지점입니다.

 

포인터에는 열 포인터(column pointer)와 줄 포인터(line pointer)와 같이 2개의 종류가 있습니다.

 

사용형식은 다음과 같습니다.

 

열 포인터 : @n
줄 포인터 : #n

 

 열 포인터 @n을 사용하면 입력지점이 n번째 열로 이동하고, 줄 포인터 #n을 사용하면 입력지점이 n번째 줄의 첫 번째 칸으로 이동합니다. 항상 n은 0보다 큰 정수여야 됩니다. 줄 포인터는 단일 관측이 최소한 두 줄 이상 있을 때만 사용이 가능합니다.

 

스크린샷_2021-07-15_오후_2.40.09.png

 

위의 예시를 보면, 다음의 자료에서는 단일 관측을 세 줄에 걸쳐 나열하였습니다. 현재 세 사람에 대한 관측값이 첫 줄의 문자 데이터는 이름, 둘째 줄의 숫자 데이터값은 차례대로 나이(age), 키(height), 몸무게(weight)이고, 셋째 줄은 자식 수(children)입니다.

 

이 자료에서 이름, 자식수, 몸무게를 입력하고 반드시 이 순서대로 입력해야 한다고 합니다. 이런 경우 현재 입력 위치를 바꿀 수 있는 포인터를 사용해야 합니다.

 

INPUT #1 name $1-15 #3 children #2 @10 weight 2. #3

 

 

줄 포인터 #1이 실행되면 첫째 줄의 첫번째 칸으로 포인터가 이동합니다. 이 지점에서 문자변수 name을 열 입력합니다. name이 입력되면 포인터는 첫째 줄의 16째 칸에 위치합니다.

 

다음으로 줄 포인터 #3이 수행되면 포인터는 셋째 줄의 첫째 칸으로 이동합니다. 여기서 children을 자유입력합니다.

 

#2는 둘째 줄의 첫째칸으로 이동합니다. 열 포인터 @10이 실행되면 현재 첫째 칸에 위치한 포인터가 열째 칸으로 이동합니다. 이 지점에서 weight를 포맷입력합니다.

 

마지막 #3에 의해 포인터는 셋째 줄의 첫째 칸으로 이동합니다. 다음의 관측을 처리할 때 포인터는 항상 현재 위치한 줄의 다음 줄의 첫째 칸으로 이동합니다. 마지막에 #3를 붙힌 이유는 포인터를 하나의 데이터에서 가장 마지막 줄로 보내기 위함입니다. 만약 #3이 없다면 두 번째 줄에 계속 포인터가 머물게 되며 그 다음 관측을 읽을 때 포인터의 위치가 자동적으로 세 번째 줄로 가게 되어 자료 입력이 제대로 이루어지지 못합니다.

그러므로 여러 줄에 걸친 관측을 읽을 때는 가장 마지막 줄에서 전혀 입력할 것이 없더라도 입력 포인터의 위치를 해당 관측의 마지막 줄로 바꾸어 놓아야만 자료 입력에 문제가 발생하지 않습니다.

 

 

 

1.4 줄 포인터의 이동 정지

 

한 줄에 둘 이상의 데이터가 있으면 하나의 데이터를 읽은 뒤 뒤 줄 포인터를 다 음 줄로 보내면 안됩니다.

이 경우에는 줄 포인터를 현재 있는 위치에서 움직이지 못하도록 지시해야 합니다. 줄 포인터의 위치를 정지시키기 또는 이동을 보류시키는 역할을 하는 지정자에는 @와 @@ 두 가지가 있습니다.

 

@: 다른 Input 문장이 나올 때까지 기다린다.
@@: 한 줄에 존재하는 모든 관측을 다 읽을 때까지 기다립니다.

 

 

스크린샷_2021-07-15_오후_3.56.34.png

 

 다음과 같이 한 줄에 여러가지 관측이 있는 경우는 @@를 사용해서 INPUT문을 작성합니다.

 

INPUT lastname $ age height weight children @@;

 

 

한 줄에 둘 이상의 관측이 포함된 경우에는 언제나 INPUT 문장에 읽으려는 모든 변수를 나열한 다음 가장 마지막에 @@를 덧붙입니다.

그러면 하나의 관측을 다 읽은 후에도 줄 포인터가 그 다음 줄로 이동하지 않아 계속 다음 관측을 입력할 수 있습니다.

 

스크린샷_2021-07-15_오후_4.02.35.png

 

 

@는 두 종류 이상의 서로 다른 관측을 읽을 때 사용합니다.

위의 예시에서 P는 Professor, S는 Student를 나타냅니다. STAT-101, MATH-205 등은 교수 입장에서는 강의 과목, 학생 입장에서는 수강과목이고, 901123 값은 학생의 학번, 그리고 마지막 문자열은 이름을 의미합니다.

 

이 자료를 읽기 위해서는 다음과 같은 Input문을 작성할 수 있습니다.

 

INPUT status $ 1 @;
IF status = 'p'
   THEN INPUT course $ profname $ 12-32;
   ELSE IF status = 'S'
        THEN INPUT course $ number name $ 19-39;

 

각 줄의 첫 칸을 읽어 P이면 과목과 교수이름을 입력하고, 만일 S라면 과목과 학번과 학생이름을 입력합니다.

이와 같이 @는 한 줄을 읽을 때 상황에 따라 입력 형식이 바뀔 경우에 사용합니다.

 

Version history
Last update:
‎07-16-2021 12:51 AM
Updated by:
Contributors

sas-innovate-white.png

Register Today!

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.

Register now!

Article Labels
Article Tags