獨斷論

SAS 초급1: 데이터 파일 읽기 본문

과학과 기술/SAS

SAS 초급1: 데이터 파일 읽기

부르칸 2021. 7. 5. 16:24

1. SAS의 기본 문법 형태

DATA step

DATA mydata;
INPUT variables;
DATALINES;
data1
data2
;
RUN;

 

PROC step

PROC procedure options;
options;
RUN;

 

2. SAS에 직접입력

아래와 같은 데이터가 있다고 가정하자.

Joe 84 79
Sue 94 97
Betty 93 89

전체학생은 3명이고 두번째 열은 중간고사 성적 그리고 세번째 열은 기말고사 성적이다. SAS의 File --> New Program을 클릭하고 아래와 같이 입력한다.

data mydat;
input name $ midterm final;
datalines;
Joe 84 79
Sue 94 97
Betty 93 89
;
run;

첫번째행은 mydat라는 SAS dataset의 이름이고

두번째행은 데이터의 각 열에 해당하는 변수명이다. name뒤에 $는 name이 문자를 값으로 가짐을 의미한다.

dataline이후로는 직접 데이터를 입력하였고 마지막에 세미콜론(;)을 추가하여 dataline이 끝났다는 것을 알려주어야한다.  마지막 run은 생략해도 되지만 형식상 data step이 끝임을 알려주기위해 넣어주는게 좋다.

데이터가 원하는데로 잘 들어갔는지 확인하려면 SAS의 explorer에서 Mydat를 더블클릭하면 된다. 또한 proc를 이용하여 아래와 같이 print할수도 있다.

proc print data = mydat;
var name final;
run;

첫번째 행은 print라는 procedure를 mydat라는 데이터를 가지고 수행한다는 뜻이다. 두번째 행에서는 print할 변수를 지정해주었다.

 

3. 데이터파일에서 불러오기

노트패드를 이용하여 각 열이 공백으로 분리된 아래와 같은 파일을 만들어 하드디스크에 저장한다. 어느 디렉토리에 저장해 두었는지 잘 기억해 두어야한다. 아래 SAS 프로그램 파일을 작성할때에는 d:\tmp\에 저장하였다.

school.txt
0.00MB

filename fnamestr 'd:\tmp\school.txt';
data mydat;
infile fnamestr;
input name $ midterm final;
run;

첫번째 행에서 filename이라는 명령어를 이용하여 school.txt가 있는 전체 디렉토리를 포함한 파일명을 fnamestr에 저장하였다. 두번째 행에서 SAS dataset의 이름이 mydat라고 지정하였고, dataline 대신에 infile 명령어를 이용하여 데이터가 d:\tmp\school.txt에 존재한다고 알려주었다. R에서 디렉토리를 표현할때 슬래쉬( / )를 이용하였지만 SAS에서는 역슬래쉬( \ )를 사용하여야 한다.

 

만약 데이터파일이 쉼표로 분리된 csv파일이고 첫번째 행에 변수명이 입력되어 있다면 아래와 같이 불러들인다.

filename fnamestr 'd:\tmp\school.csv';
data mydat;
	infile fnamestr dlm="," firstobs=2;
	input name $ midterm final;
run;

infile fnamestr의 뒤에 delimiter를 쉼표로 지정하였고(dlm=","), 파일의 두번째행부터 읽으라고 firstobs=2를 지정하였다.

파일이름을 따로 fnamestr의 변수에 저장하지 않고 직접 infile에 넣을수 있다.

data mydat;
	infile 'd:\tmp\school.csv' dlm="," firstobs=2;
	input name $ midterm final;
run;

 

4. 새로운 변수 만들기

데이터파일에 존재하지 않는 변수를 데이터를 불러들이면서 새로운 변수를 만들수 있다. 중간고사와 기말고사의 평균을 score라는 새로운 변수를 만들어 입력하려면 아래와 같이 수행한다.

filename fnamestr 'd:\tmp\school.txt';
data mydat;
infile fnamestr;
input name $ midterm final;
score = (midterm + final) / 2;
run;

 

또한 score가 90이상이면 A, 90 미만일때는 B를 갖는 Grade라는 변수를 만들수 있다.

filename fnamestr 'd:\tmp\school.txt';
data mydat;
infile fnamestr;
input name $ midterm final;
score = (midterm + final) / 2;
if score >= 90 then grade = "A";
else grade = "B";
run;

5. 데이터 병합

두 데이터 파일을 하나의 데이터로 만들때 사용한다. 아래와 같은 두 데이터파일이 있을때

mydat1.txt
0.00MB
mydat2.txt
0.00MB

두 데이터파일을 SAS에서 읽은 후에 "SET" 명령어를 이용하여 하나로 합칠수 있다.

filename fnstr1 'd:\tmp\mydat1.txt';
data mydat1;
infile fnstr1;
input name $ weight height;
run;

filename fnstr2 'd:\tmp\mydat2.txt';
data mydat2;
infile fnstr2;
input name $ eye $ hair $;
run;

data mydat;
set mydat1 mydat2;
run;

proc print data = mydat;
run;

명령어 SORT를 사용하면 이름순으로 합칠수 있다.

filename fnstr1 'd:\tmp\mydat1.txt';
data mydat1;
infile fnstr1;
input name $ weight height;
run;

filename fnstr2 'd:\tmp\mydat2.txt';
data mydat2;
infile fnstr2;
input name $ eye $ hair $;
run;

proc sort data = mydat1;
by name;
run;

proc sort data = mydat2;
by name;
run;

data mydat;
set mydat1 mydat2;
by name;
run;

proc print data = mydat;
run;

그러나 Bert라는 사람이 동일인이라면 obs2와 obs3은 하나의 observation이 되어야만 한다. 이땐 명령어 merge를 사용한다.

filename fnstr1 'd:\tmp\mydat1.txt';
data mydat1;
infile fnstr1;
input name $ weight height;
run;

filename fnstr2 'd:\tmp\mydat2.txt';
data mydat2;
infile fnstr2;
input name $ eye $ hair $;
run;

proc sort data = mydat1;
by name;
run;

proc sort data = mydat2;
by name;
run;

data mydat;
merge mydat1 mydat2;
by name;
run;

proc print data = mydat;
run;

 

6. Observation 지우기

원하지 않는 행을 data step에서 지울수가 있다.

만약 몸무게가 60이 미만인 사람을 지우고 싶다면 위 data mydat의 merge단계에서 아래와 같이 코드를 첨가하면 된다.

data mydat;
merge mydat1 mydat2;
by name;
if weight <= 60 then delete;
run;

proc print data = mydat;
run;

주의해야할점은 missing value는 모든 값보다 작다고 여기므로 몸무게가 50인 Charlie뿐만 아니라 missing value가 있는 David의 행 전체가 삭제되었다.

 

7. Missing value가 있는 행 전체 지우기

결측값만 있는 행을 지우고 싶다면 아래와 같이 수행한다.

data mydat;
merge mydat1 mydat2;
by name;
if missing(weight) then delete;
run;

proc print data = mydat;
run;

Comments