獨斷論

SAS 문법 - 8: DATA step과 내부변수 _N_ 본문

과학과 기술/SAS

SAS 문법 - 8: DATA step과 내부변수 _N_

부르칸 2021. 9. 4. 03:17

데이터를 여러가지 방법으로 불러들이기 위해서는 data step에서 사용되는 내부변수 _N_을 잘 활용하여야만 한다.

 

SAS에서 데이터파일을 읽어들일때에 data에서 run까지 한번만 수행하는것이 아니라 data~run을 한번 수행할때마다 데이터파일의 1번째 행을 불러들인다(이때 _N_ = 1이다). 그리고 다시 data 첫줄로 가서 run까지 다시 실행하면서 데이터파일의 2번째 행을 불러들인다( _N_ = 2). 이러한 반복과정을 데이터파일의 마지막 행까지 실행하게 된다.

이때 내부변수 _N_은 data~run을 몇번째 실행하였는지 알려주며 대개 현재읽어들이는 데이터파일의 행과 일치한다.

 

쉽게 예를들어보자.

DATA hospitaldat;
  input subj 1-4 name $ 6-23 no_vis 25-26 expense 28-34;
  totalexp = no_vis * expense;
  DATALINES;
1024 Alice Smith        7  1001.98
1167 Maryann White      2  2999.34
1168 Thomas Jones       10 3904.89
1201 Benedictine Arnold 1  1450.23
1302 Felicia Ho         7  1209.94
1471 John Smith         6  1763.09
1980 Jane Smiley        5  3567.00
;
RUN;
 
PROC PRINT data = hospitaldat;

RUN;

위와같은 SAS코드를 실행할때를 생각해보면

 

data step의 첫줄, 즉 data hospitaldat를 실행하면서  SAS는 내부적으로 program data vector를 만든다.

이 벡터에는 아래의 변수를 가진다.

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 1  0          

_N_의 값에는 1, _Error_ 값에는 0이 들어가고 나머지는 아직 채워지지 않은 상태이다.

_Error_는 데이터를 읽어들일때 오류가 있는지 나타내는 변수이고 아직 오류가 없으므로 0을 값으로 가진다.

 

input subj 1-4 name $ 6-23 no_vis 25-26 expense 28-34; 을 실행하게 될때

위 program data vector에 totalexp를 제외한 나머지 값들이 채워지게 된다.

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 1  0  1024  Alice Smith  7  1001.98  

 

totalexp = no_vis * expense;를 실행하게 될때 totalexp에 no_vis와 expense를 곱한 값이 들어간다.

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 1  0  1024  Alice Smith  7  1001.98  7013.86

 

Run;을 실행할때 program data vector에 있던 값들이 work.hospitaldat에 첫번째 행의 데이터로 채워진다

(SAS코드에서 data hospitaldat;로 지정하면 work.hospitaldat로 만들어진다).

work.hospitaldat는 아래와 같다.

 subj  name  no_vis  expense  totalexp
 1024  Alice Smith  7  1001.98  7013.86

program data vector의 값중에 _N_과 _Error_를 제외한 나머지 값들을 work.hospitaldat에 쓴다.

 

Run을 실행하고 data step이 끝나는 것이 아니라

다시 data step의 첫줄 data hospitaldat; 코드를 실행하게 되는데 이때 _N_ =2 가 되고 _Error_ = 0이 되고 program data vector는 아래와 같다.

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 2  0          

 

input subj 1-4 name $ 6-23 no_vis 25-26 expense 28-34를 실행하면 아래와 같다. 

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 2  0  1167  Maryann White  2  2999.34  

 

totalexp = no_vis * expense를 실행하면 아래와 같다.

 _N_  _Error_  subj  name  no_vis  expense  totalexp
 2  0  1167  Maryann White  2  2999.34 5998.68

 

Run;를 두번째 실행할때 위 program data vector를 work.hospitaldat의 두번째 행에 쓰게 된다.

work.hospitaldat는 아래와 같다.

 subj  name  no_vis  expense  totalexp
 1024  Alice Smith  7  1001.98  7013.86
 1167  Maryann White  2  2999.34  5998.68

 

다시 data step 첫번째줄로 돌아가 _N_=3이 되고 _Error_=0이 된다.

이러한 반복과정을 데이터파일 여기서는 datalines에 더이상 불러들일 데이터값이 존재하지 않을때까지 반복한다.

 

정상적으로 실행했다면 아래와 같이 출력된다.

Comments