출력데이터에서 변수가 한글로 나와있는 경우 컬럼 레이블이 저장되어 있어 레이블이 출력
실제 변수는 '컬럼 이름(영어)
그래서 편집기에선 AGE로 입력 실제 보이는건 AGE의 레이블인 나이로 보임.
1. PROC SORT(순서대로 정렬하기)
1) 오름차순
ASCENDING이 기본 값
BY ASCENDING 변수명;
확장편집기
PROC SORT DATA=SASHELP.CLASS OUT=TEST; /*SORT PROCEDURE를 사용하여(PROC SORT) SASHELP라이브러리(SASHELP.)의 CLASS테이블을 불러오고(DATA=) 정렬한 결과값은 WORK라이브러리의 ‘TEST’테이블로 저장함.*/
BY AGE; /*AGE를 오름차순으로 정렬함(BY로 인함)*/
RUN; /*모든 명령어를 종료*/
로그
NOTE: 19개의 관측값을 데이터셋 SASHELP.CLASS에서 읽었습니다.
NOTE: 데이터셋 WORK.TEST은(는) 19개 관측값과 5개 변수를 가집니다.
결과
이름 | 성별 | 나이 | 키(단위: 인치) | 몸무게(단위: 파운드) |
조이스 | 여 | 11 | 51.3 | 50.5 |
토마스 | 남 | 11 | 57.5 | 85 |
제임스 | 남 | 12 | 57.3 | 83 |
제인 | 여 | 12 | 59.8 | 84.5 |
존 | 남 | 12 | 59 | 99.5 |
루이스 | 여 | 12 | 56.3 | 77 |
로버트 | 남 | 12 | 64.8 | 128 |
앨리스 | 여 | 13 | 56.5 | 84 |
바바라 | 여 | 13 | 65.3 | 98 |
제프리 | 남 | 13 | 62.5 | 84 |
알프레드 | 남 | 14 | 69 | 112.5 |
캐롤 | 여 | 14 | 62.8 | 102.5 |
헨리 | 남 | 14 | 63.5 | 102.5 |
주디 | 여 | 14 | 64.3 | 90 |
자넷 | 여 | 15 | 62.5 | 112.5 |
메리 | 여 | 15 | 66.5 | 112 |
로날드 | 남 | 15 | 67 | 133 |
윌리엄 | 남 | 15 | 66.5 | 112 |
필립 | 남 | 16 | 72 | 150 |
숫자: 작은 수 -> 큰 수
한글: 가나다 순
영어: 알파벳 순
한영: 영어 -> 한글
‘OUT=TEST'를 쓰지 않는다면 원본 데이터에서 업데이트 -> 원본 손상
2) 내림차순
BY DESCENDING 변수명;
확장편집기
PROC SORT DATA=TEST;
BY DESCENDING AGE;
RUN;
앞에 오름차순하고 아웃풋 한 TEST 파일을 그대로 내림차순하기
로그
NOTE: 19개의 관측값을 데이터셋 WORK.TEST에서 읽었습니다.
NOTE: 데이터셋 WORK.TEST은(는) 19개 관측값과 5개 변수를 가집니다.
결과
이름 | 성별 | 나이 | 키(단위: 인치) | 몸무게(단위: 파운드) |
필립 | 남 | 16 | 72 | 150 |
자넷 | 여 | 15 | 62.5 | 112.5 |
메리 | 여 | 15 | 66.5 | 112 |
로날드 | 남 | 15 | 67 | 133 |
윌리엄 | 남 | 15 | 66.5 | 112 |
알프레드 | 남 | 14 | 69 | 112.5 |
캐롤 | 여 | 14 | 62.8 | 102.5 |
헨리 | 남 | 14 | 63.5 | 102.5 |
주디 | 여 | 14 | 64.3 | 90 |
앨리스 | 여 | 13 | 56.5 | 84 |
바바라 | 여 | 13 | 65.3 | 98 |
제프리 | 남 | 13 | 62.5 | 84 |
제임스 | 남 | 12 | 57.3 | 83 |
제인 | 여 | 12 | 59.8 | 84.5 |
존 | 남 | 12 | 59 | 99.5 |
루이스 | 여 | 12 | 56.3 | 77 |
로버트 | 남 | 12 | 64.8 | 128 |
조이스 | 여 | 11 | 51.3 | 50.5 |
토마스 | 남 | 11 | 57.5 | 85 |
"BY AGE 이니깐 나이순으로 정렬 후 동일한 나이일 경우 첫번째 변수를 기준으로 정렬한다.
여기에는 이름이 한글이지만, 영어이름이라고 생각하면 알파벳 순으로 정렬된 것이 보인다." (라고 영상에서 들었다.)
그러면 오름차순에서는 아래와 같이 이해가 간다.
나이 오름차순 후 -> 동일 나이시 영어이름으로 오름차순
12살 기준 "James -> Jane -> John -> Louis ->Robert" 으로 진행이 되니깐,
그런데 왜 내림차순도 12살 기준 순서가 James -> Jane -> John -> Louis ->Robert 이렇게 가는 걸까?
역으로 가야하는거 아닌가요어,, (´。_。`)
한개 변수만 디센딩으로 솔팅하고 이후 동일값은 무조건 오름차순인가..?
* View Table을 열어 둔 상태에서 코드를 실행할 경우 오류발생
로그
ERROR: 열기을(를) 할 수 없습니다.(대상 데이터: WORK.TEST.DATA 목적: 출력 액세스 컨트롤: 멤버 - 레벨 컨트롤) (원인: WORK.TEST.DATA을(를) 사용 중임. 사용자 본인에 의해 사용 중 입니다. 리소스 환경: SORT).
NOTE: 오류가 발생하여 SAS 시스템은 현재 스템의 실행을 중지합니다.
2. PROC PRINT(테이블 보여주기)
확장편집기
PROC PRINT DATA=SASHELP.CLASS;/*PRINT PROCEDURE를 사용하여(PROC PRINT) SASHELP라이브러리(SASHELP.)의 CLASS테이블을 불러옴(DATA=)*/
RUN;/*명령어를 종료*/
로그
NOTE: 19개의 관측값을 데이터셋 SASHELP.CLASS.에서 읽었습니다.
Result Viewer - SAS Output
OBS | Name | Sex | Age | Height | Weight |
1 | 알프레드 | 남 | 14 | 69.0 | 112.5 |
이하 순번대로 출력 |
PROC PRINT를 할 경우 Result Viewer를 통해 바로 결과창을 보여줌
확장편집기
PROC PRINT DATA=SASHELP.CLASS; /*PRINT PROCEDURE를 사용하여(PROC PRINT) SASHELP라이브러리(SASHELP.)의 CLASS테이블을 불러옴(DATA=).*/
VAR AGE NAME;/*변수(AGE,NAME)를 불러옴(VAR)*/
RUN;/*명령어를 종료*/
로그
NOTE: 19개의 관측값을 데이터셋 SASHELP.CLASS.에서 읽었습니다.
Result Viewer - SAS Output
OBS | Age | Name |
1 | 14 | 알프레드 |
이하 순번대로 출력 |
PROC PRINT 구문에서 BY(그룹화)를 사용하고 싶으면 오름차순으로 정렬되어 있어야함.
오름차순으로 정렬하기 위해선 PROC SORT를 활용
확장편집기
PROC SORT DATA=SASHELP.CLASS OUT=TEST;
BY AGE;
RUN;
PROC PRINT DATA=TEST;/*PRINT PROCEDURE를 사용하여(PROC PRINT) SASHELP라이브러리(SASHELP.)의 CLASS테이블을 불러옴(DATA=).*/
VAR AGE NAME;/*변수(AGE,NAME)를 불러옴(VAR)*/
ID AGE;/*변수(AGE)를 기준값으로 사용함*/
BY AGE;/*변수(AGE)를 그룹으로 만듦(※BY구문이 적용되는 변수는 오름차순 정렬돼 있어야 함)*/
RUN;/*명령어를 종료*/
Result Viewer - SAS Output
Age | Age | Name |
11 | 11 | 조이스 |
11 | 토마스 |
Age | Age | Name |
12 | 12 | 제임스 |
12 | 제인 | |
12 | 존 | |
12 | 루이스 | |
12 | 로버트 |
13, 14, 15, 16까지 ID를 기준값으로 ID를 그룹화하여 출력
확장편집기
PROC PRINT DATA=TEST;
VAR AGE NAME;
BY AGE;
RUN;
Result Viewer - SAS Output
나이 = 11
OBS | Age | Name |
1 | 11 | 조이스 |
2 | 11 | 토마스 |
나이 = 12
OBS | Age | Name |
3 | 12 | 제임스 |
4 | 12 | 제인 |
5 | 12 | 존 |
6 | 12 | 루이스 |
7 | 12 | 로버트 |
13, 14, 15, 16까지 ID를 그룹화하여 출력
3. PROC CONTENTS(테이블 속성 보기)
확장편집기
PROC CONTENTS DATA=SASHELP.CLASS;/*라이브러리SASHELP의 테이블CLASS의 속성정보를 불러옴(CONTENTS)*/
RUN;/*SAS명령어 종료*/
Result Viewer - SAS Output
CONTENTS 프로시저
데이터셋 이름 | SASHELP.CLASS | 관측값 | 19 |
멤버 유형 | DATA | 변수 | 5 |
엔진 | V9 | 인덱스 | 0 |
생성일 | 2023.08.29 17:00:00 | 관측값 길이 | 40 |
마지막 수정일 | 2023.08.29 17:00:00 | 삭제된 관측값 | 0 |
보호 | 압축여부 | 아니요 | |
데이터셋 유형 | 정렬 | 아니요 | |
레이블 | 학생 데이터 | ||
데이터 표현 | WIONDOWS_64 | ||
인코딩 | euc-kr Korean (EUC) |
엔진/호스트 관련 정보 | |
데이터셋 페이지 크기 | 65536 |
데이터셋 페이지 번호 | 1 |
첫 번째 데이터 페이지 | 1 |
페이지 당 최대 관측값 수 | 1632 |
첫 번째 데이터 페이지의 관측값 수 | 19 |
데이터셋 수리의 번호 | 0 |
ExtendObsCounter | YES |
파일 이름 | C:\Programs Files\SASHome\SASFoundation\9.4\nls\ko\sashelp\class.sas7bdat |
생성된 릴리즈 | 9.0401M5 |
생성된 호스트 | X64_SR12R2 |
소유자 이름 | BUILTIN\Administrotors |
파일 크기 | 128KB |
파일 크기 (바이트) | 131072 |
변수와 속성 리스트(오름차순) | ||||
# | 변수 | 유형 | 길이 | 레이블 |
3 | Age | 숫자 | 8 | 나이 |
4 | Height | 숫자 | 8 | 키(단위: 인치) |
1 | Name | 문자 | 12 | 이름 |
2 | Sex | 문자 | 4 | 성별 |
5 | Weight | 숫자 | 8 | 몸무게(단위: 파운드) |
위키독스는 레이블에 숫자값이 있어 해당 표는 강의 영상 기준 Result Viewer를 작성함.
마지막 테이블은 변수 알파 순으로 오름차순되어서 보여줌
SAS작업을 하면서 CONTENTS 명령어를 통해 주로 확인하는 속성을 다음과 같습니다.
1.데이터셋 이름: 테이블 이름과 라이브러리명을 확인합니다.
2.생성일: 테이블 생성 일자를 확인합니다.
3.관측치: 관측값이 몇 개의 행으로 이뤄져 있는지 확인합니다.
4.변수: 변수가 몇 개가 있는지 확인합니다.
5.파일 이름: 테이블이 저장된 폴더주소와 실제 파일 이름을 확인합니다.
6.인덱스: 인덱스가 몇 개 설정돼 있는지 확인합니다(인덱스 내용에 대해서는 뒤에 배우겠습니다).
7.정렬: 테이블이 특정 변수를 기준으로 정렬돼 있는지 여부를 ‘예/아니요’로 확인합니다.
8.파일 크기: 테이블의 용량을 확인합니다.
확장편집기
PROC CONTENTS DATA=WORK._ALL_;
RUN;
WORK 라이브러리에 대한 속성 정보와 그 내부에 들어있는 테이블 전체를 보여줌
4. PROC FREQ(빈도 조회)
확장편집기
PROC FREQ DATA=SASHELP.CLASS; /*FREQ PROCEDURE를 사용하여(PROC FREQ) SASHELP 라이브러리의 CLASS테이블을 불러옴(DATA=SASHELP.CLASS).*/
TABLE AGE HEIGHT;/*변수 AGE와 HEIGHT을 조회함*/
RUN;/*모든 명령어를 종료*/
결과
나이 | ||||
Age | 빈도 | 백분율 | 누적빈도 | 누적백분율 |
11 | 2 | 10.53 | 2 | 10.53 |
12 | 5 | 26.32 | 7 | 36.84 |
13 | 3 | 15.79 | 10 | 52.63 |
14 | 4 | 21.05 | 14 | 73.68 |
15 | 4 | 21.05 | 18 | 94.74 |
16 | 1 | 5.26 | 19 | 100.00 |
키(단위:인치) | ||||
Height | 빈도 | 백분율 | 누적빈도 | 누적백분율 |
51.3 | 1 | 5.26 | 1 | 5.26 |
56.3 | 1 | 5.26 | 2 | 10.53 |
56.5 | 1 | 5.26 | 3 | 15.79 |
57.3 | 1 | 5.26 | 4 | 21.05 |
57.5 | 1 | 5.26 | 5 | 26.32 |
59 | 1 | 5.26 | 6 | 31.58 |
59.8 | 1 | 5.26 | 7 | 36.84 |
62.5 | 2 | 10.53 | 9 | 47.37 |
62.8 | 1 | 5.26 | 10 | 52.63 |
63.5 | 1 | 5.26 | 11 | 57.89 |
64.3 | 1 | 5.26 | 12 | 63.16 |
64.8 | 1 | 5.26 | 13 | 68.42 |
65.3 | 1 | 5.26 | 14 | 73.68 |
66.5 | 2 | 10.53 | 16 | 84.21 |
67 | 1 | 5.26 | 17 | 89.47 |
69 | 1 | 5.26 | 18 | 94.74 |
72 | 1 | 5.26 | 19 | 100.00 |
확장편집기
PROC FREQ DATA=SASHELP.CLASS;
TABLE SEX AGE;/*변수 SEX와 AGE의 2차원 표를 조회함*/
RUN;
성별 | ||||
Sex | 빈도 | 백분율 | 누적빈도 | 누적백분율 |
남 | 10 | 52.63 | 10 | 52.63 |
여 | 9 | 47.37 | 19 | 100.00 |
나이 | ||||
Age | .빈도 | 백분율 | 누적빈도 | 누적백분율 |
11 | 2 | 10.53 | 2 | 10.53 |
12 | 5 | 26.32 | 7 | 36.84 |
13 | 3 | 15.79 | 10 | 52.63 |
14 | 4 | 21.05 | 14 | 73.68 |
15 | 4 | 21.05 | 18 | 94.74 |
16 | 1 | 5.26 | 19 | 100.00 |
확장편집기
PROC FREQ DATA=SASHELP.CLASS;
TABLE SEX*AGE;
RUN;
빈도 백분율 행 백분율 칼럼 백분율 |
테이블 Sex * Age | |||||||
Sex(성별) | Age(나이) | |||||||
11 | 12 | 13 | 14 | 15 | 16 | 합계 | ||
남 | 1 5.26 10.00 50.00 |
3 15.79 30.00 60.00 |
1 5.26 10.00 33.33 |
2 10.53 20.00 50.00 |
2 10.53 20.00 50.00 |
1 5.26 10.00 100.00 |
10 52.63 |
|
여 | 1 5.26 11.11 50.00 |
2 10.53 22.22 40.00 |
2 10.53 22.22 66.67 |
2 10.53 22.22 50.00 |
2 10.53 22.22 50.00 |
0 0.00 0.00 0.00 |
9 47.37 |
|
합계 | 2 10.53 |
5 26.32 |
3 15.79 |
4 21.05 |
4 21.05 |
1 5.26 |
19 100.00 |
PROC FREQ는 VAR이 아닌 TABLE 사용
TABLE은 행과 열로 이루어진 표를 의미
"TABLE 변수1*변수2"로 작성하면 변수1, 변수2로 이루어진 교차표 생성
'STUDY(공개) > SAS' 카테고리의 다른 글
6. 테이블 결합 (0) | 2023.09.02 |
---|---|
5. 데이터 전처리를 위한 SAS 명령 (0) | 2023.09.02 |
4. 포맷(FORMAT)의 개념 (0) | 2023.09.01 |
3. 데이터 생성법 (0) | 2023.08.29 |
1. SAS의 기초 (0) | 2023.08.29 |
댓글