일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- post hoc test
- ANOVA
- 신라
- 독사방여기요
- 기자조선
- linear regression
- 한서
- 지리지
- 패수
- 통계
- 후한서
- t test
- R
- repeated measures ANOVA
- spss
- 한서지리지
- 히스토그램
- 기자
- 낙랑군
- 우분투
- 풍백
- 태그를 입력해 주세요.
- Histogram
- 선형회귀분석
- 고구려
- 유주
- 창평
- 단군
- categorical variable
- 통계학
- Today
- Total
獨斷論
SAS 문법 - 8: DATA step과 내부변수 _N_ 본문
데이터를 여러가지 방법으로 불러들이기 위해서는 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에 더이상 불러들일 데이터값이 존재하지 않을때까지 반복한다.
정상적으로 실행했다면 아래와 같이 출력된다.