獨斷論

SAS 문법 - 3 데이터 불러오기 본문

과학과 기술/SAS

SAS 문법 - 3 데이터 불러오기

부르칸 2021. 8. 25. 05:53

SAS에서는 데이터파일 안의 각 열이 어떻게 구분되냐에 따라

  • column input
  • list input
  • formatted input

으로 구분한다.

 

Column input란 각 열의 크기를 숫자로 정해주어 변수에 지정하는 방법이고

List input이란 각 열이 공백으로 나누어져 있을때 데이터를 불러들이는 방법이고

Formatted input은 데이터 특별한 형식을 가지고 있을때 사용하는 방법이다.

 

Column input

데이터가 아래와 같을때

1024 Alice Smith        1 65 125
1167 Maryann White      1 68 140
1168 Thomas Jones       2 68 190
1201 Benedictine Arnold 2 68 190
1302 Felicia Ho         1 63 115

Col_Input.txt
0.00MB

각 변수의 데이터가 몇번째 열까지인지 코드에 나타낸다.

data WgtHgt;
	infile "d:\tmp\Col_Input.txt";
	input subj 1-4 name $ 6-23 gender 25 height 27-28 weight 30-32;
run;

proc print data=WgtHgt;
run;

Column input은 데이터파일의 열을 반복해서 읽을수 있는 장점이 있다. 만약 이름의 첫번째문자를 따로 저장하고 싶다면 아래와 같이 6번째 열을 읽어서 init에 넣도록 하면 된다.

data WgtHgt;
	infile "d:\tmp\Col_Input.txt";
	input subj 1-4 init $ 6 name $ 6-23 gender 25 height 27-28 weight 30-32;
run;

proc print data=WgtHgt;
run;

 

List input

데이터 구분이 고정폭으로 주어지지 않고 각 변수의 데이터를 공백으로 구분한다. 따라서 문자열 변수의 경우 공백이 들어가서는 안되며 문자열의 길이는 8자를 넘지 못한다.

데이터 파일이 아래와 같을때

1024 AliceSmith 1 65 125
1167 MaryannWhite 1 68 140
1168 ThomasJones 2 68 190
1201 BenedictineArnold 2 68 190
1302 FeliciaHo 1 63 115

list_input.txt
0.00MB

아래 SAS코드를 실행하면 name 변수가 8자 이상은 잘렸음을 알수 있다.

data WgtHgt;
	infile "d:\tmp\list_Input.txt";
	input subj name $ gender height weight;
run;

proc print data=WgtHgt;
run;

데이터 변수를 공백으로 구분하므로 missing value가 있을 경우 공백으로 그대로 두어서는 안되고 점( . )을 꼭 입력해야만 한다.

1024 AliceSmith 1 65 125
1167 . 1 68 140
1168 ThomasJones 2 68 190
1201 BenedictineArnold 2 . 190
1302 FeliciaHo 1 63 115

list_input1.txt
0.00MB

위 데이터를 가지고 아래 코드를 실행하면

data WgtHgt;
	infile "d:\tmp\list_Input1.txt";
	input subj name $ gender height weight;
run;

proc print data=WgtHgt;
run;

결측값이 제대로 입력되어 있지만 점( . )을 넣지 않고 그대로 공백으로 두면 데이터가 아래처럼 제대로 들어가지 않는다.

쉼표로 분리된 csv파일도 결측값이 있을때에는 점( . )을 꼭 넣어주어야만 한다.

1024,Alice Smith,1,65,125
1167,Maryann White,1,68,140
1168,.,2,.,190
1201,Benedictine Arnold,2,68,190
1302,Felicia Ho,1,63,115

Commainput.csv
0.00MB

위와 같이 Thomas Jones의 이름이 빠져있고 이사람의 키가 빠져있다면 꼭 점( . )을 넣어주어야만 한다.

data WgtHgt;
	infile "d:\tmp\Commainput.csv" delimiter=",";
	input subj name $ gender height weight;
run;

proc print data=WgtHgt;
run;

위 코드를 실행하면 각 변수마다 데이터가 제대로 들어가지만 만약 아래와 같이 결측값을 쉼표 사이에 그냥 둔다면 데이터를 제대로 불러들일수가 없다.

1024,Alice Smith,1,65,125
1167,Maryann White,1,68,140
1168,,2,,190
1201,Benedictine Arnold,2,68,190
1302,Felicia Ho,1,63,115

그러나 csv 파일에서 결측값을 점( . )으로 표시하지 않고 공백으로 표시한다면 결측값을 제대로 불러들일수가 있다.

1024,Alice Smith,1,65,125
1167,Maryann White,1,68,140
1168, ,2, ,190
1201,Benedictine Arnold,2,68,190
1302,Felicia Ho,1,63,115

Commainput2.csv
0.00MB

data WgtHgt;
	infile "d:\tmp\Commainput2.csv" delimiter=",";
	input subj name $ gender height weight;
run;

proc print data=WgtHgt;
run;
Comments