일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 기자조선
- 단군
- 기자
- Histogram
- 창평
- 유주
- 통계학
- 한서
- 지리지
- 히스토그램
- post hoc test
- R
- t test
- 신라
- 고구려
- 낙랑군
- ANOVA
- spss
- 태그를 입력해 주세요.
- repeated measures ANOVA
- 통계
- 우분투
- 독사방여기요
- 한서지리지
- categorical variable
- 후한서
- 풍백
- 선형회귀분석
- linear regression
- 패수
- Today
- Total
獨斷論
SAS 초급1: 데이터 파일 읽기 본문
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\에 저장하였다.
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. 데이터 병합
두 데이터 파일을 하나의 데이터로 만들때 사용한다. 아래와 같은 두 데이터파일이 있을때
두 데이터파일을 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;