이번글은 [SAS] 데이터 입력하기 Part2의 이어지는 글 입니다.
PRINT문은 SAS에서 가장 간단하고 많이 쓰는 호출문입니다.
PRINT는 선택사항으로 지정하지 않으면 출력창으로 출력됩니다.
PRINT문 기본사용 문법입니다.
PROC PRINT DATA = SASdataset(options);
ID variables;
VAR variables;
BY variables;
RUN;
데이터 입력하기 Part1에서 사용했던 class 데이터를 사용하여 Print문 사용법을 알아보겠습니다.
data class;
input name $ number gender $ dept $ exam1 exam2;
datalines;
minyoung 1 f stat 50 50
minji 2 f computer 50 50
kongjui 6 f computer 20 40
patjui 3 f stat 20 45
heungboo 5 m computer 25 25
nolboo 4 m stat 29 28
;
run;
1) 처음 3개의 케이스 출력하기
→ obs=3 옵션을 사용합니다.
PROC PRINT DATA = class(obs=3);
RUN;
obs는 레이블로 'observation'의 앞 3글자입니다.
obs를 출력하고 싶지 않으면 선택사항 noobs를 지정하거나 ID문장을 사용합니다.
PROC PRINT DATA = subset NOOBS;
RUN;
2) ID
'Identification'의 약자로 ID문을 생략하면 관측번호 obs가 출력됩니다.
ID문을 사용할 떄는 각 관측의 신분을 대신할 수 있는 변수(들)을 나열해야 합니다.
ID 변수는 출력시 가장 왼쪽에 인쇄됩니다. ID다음에 둘 이상의 변수가 지정되면 지정 순서대로 출력됩니다.
다음은 nuber을 ID변수로 지정한 경우로 출력에서 관측번호 obs가 없어지고 number가 가장 먼저 출력되었음을 확인할 수 있습니다.
PROC PRINT DATA = class;
ID number;
RUN;
ID변수로 number 지정 결과입니다.
3) VAR
VAR문은 변수의 출력순서를 결정하는데 쓰입니다.
또한, 일부 변수만 출력시킬 수 있습니다. VAR문이 없으면 모든 변수가 입력된 순서대로 출력됩니다.
PRINT문에서 출력되는 변수의 순서는 ID문장에서 지정된 변수가 우선이고 그 다음은 VAR문에서 지정된 순서를 따릅니다.
다음은 name과 gender만을 출력하는 코드입니다.
PROC PRINT DATA = class;
VAR name gender;
RUN;
nam변수와 gender만 출력되는 결과입니다.
ID문과 VAR문을 같이 사용한 코드입니다.
PROC PRINT DATA = class;
ID number;
VAR dept name gender;
RUN;
obs가 아닌 number가 가장 먼저 출력이 되고 var문을 사용해서 모든 변수가 출력이 되는 것이 아니라 dept, name, gender 변수만 출력하였습니다.
4) BY
BY문은 특정 변수의 값에 따라 자료를 분할 처리하려는 목적에 사용됩니다.
BY문을 사용할 때는 먼저 처리하려는 SAS자료가 BY 다음에 지정하는 변수들에 대하여 오름차순이건 내림차순이건 순서화되어 있어야 합니다. 순서화 작업은 SORT문에서 가능합니다.
class 데이터에서 과(dept)별로 나뉘어 출력하려고 합니다. 이렇게 분할 처리를 하려면 BY문을 사용합니다.
PROC SORt DATA = class;
BY dept;
RUN;
PROC PRINT DATA = class;
BY dept;
RUN;
class 데이터에서 dept를 기준으로 순서화한 다음 과별로 데이터를 인쇄하였습니다.
ID, VAR, BY문을 모두 사용하여 출력을 제어하고 있습니다.
과별로 이미 순서가 정해져 있는 위의 코드를 사용해서 처리합니다.
PROC PRINT DATA = class;
ID number;
BY dept;
VAR name gender exam1 exam2;
RUN;
BY문에서 디폴트로 처리하는 방식은 오름차순입니다.
내림차순으로 정리하고 싶은 BY 변수 앞에는 DESCENDING을 붙힙니다.
다음은 gender변수와 dept변수에 대하여 내림차순으로 정리한 예시입니다.
PROC SORT DATA = class OUT = new;
BY DESCENDING gender dept;
RUN;
사용자가 자신만의 포맷을 작성하고 이를 변수에 적용하여 데이터의 출력결과를 보기 좋게 인쇄하려는 프로시저입니다.
FORMAT문의 일반적인 사용형식은 다음과 같습니다.
PROC FORMAT <option(s)>;
VALUE <$> name
<(format-option(s))> <value-range-set(s)>;
RUN;
여기서 VALUE는 데이터를 출력하는데 사용할 문자열을 지정할 수 있도록 형식을 만드는 문장입니다.
이때 숫자형 변수에는 지정한 포맷이름 앞에 '$'를 적지 않고 문자형 변수에는 포맷이름 앞에 '$'를 적습니다. 예를 들어, 'A','B','C'의 값을 갖는 변수 'order'의 변수값이 A일 때 '상', B일때 '중', C일때 '하'로 표현되도록 한다면 VALUE $ ordername 'A'='상' 'B'='중' 'C'='하'로 작성합니다.
먼저 FORMAT문을 작성한 후 PROC PRINT나 PROC FREQ등과 같이 결과를 인쇄하는 프로시저에 FORMAT문을 넣으면 값이 지정된 형식으로 출력합니다.
DATA work.example;
INPUT name $ number gender $ dept $ exam;
DATALINES;
Minyoung 1 f stat 50
Minji 2 f computer 50
Kongjui 6 f computer 30
Patjui 3 f stat 32.5
Heungboo 5 m computer 25
Nolboo 4 m stat 28.5
;
run;
FORMAT문을 이용한 간단한 예시입니다.
PROC FORMAT;
VALUE fexam low - < 30 ='하'
30 - < 50 = '중'
50 - high = '상';
VALUE $fgender 'f' = '여자'
'm' = '남';
RUN;
PROC PRINT;
RUN;
PROC PRINT DATA = work.example;
FORMAT exam fexam. gender $fgender.;
RUN;
FORMAT문을 이용하여 exam변수가 30미만의 값을 가지면 '하'가 인쇄되고, 30이상 50미만의 값에는 '중', 50이상의 값을 가지면 '상'으로 출력되는 fexam이라는 포맷을 생성합니다.
gender변수가 'F'값을 가지면 '여자'로, 'M'값을 가지면 '남자'로 출력됩니다.
SORT문은 데이터 내 관측의 배열을 하나 또는 그 이상의 지정된 변수의 값에 따라 순서화할 때 사용합니다.
SAS 자료를 지정된 변수값에 따라 구분하여 독립적으로 분할 처리하려면 반드시 BY문장을 삽입해야 하는데 SORT문을 항상 BY문을 사용하려는 프로시저 전에 나와야 합니다.
다음의 데이터는 6명의 학생에 대한 이름, 성별, 소속과에 대한 자료입니다.
소속과는 '통계', '수학','컴퓨터' 3개의 과로 구성되어 있으며 과별로 순서화하려고 합니다.
한글 자모순으로 하면 수학과 학생이 가장 앞으로 가고, 그 다음이 컴퓨터과 학생, 맨 마지막이 통계학과 학생이 되게끔 관측을 재배열합니다.
다음과 같이 class2 데이터를 만들고 Sort에 따라 성별과 과별로 순서화되게 재배열하려고 합니다.
data class2;
input name $ sex $ dept $;
datalines;
Minyoung F Stat
Baram M Math
Chundung F Computer
Minji F Stat
Gooroom F Math
Siin M Computer
;
run;
proc sort data = class2 out=class2_1;
by sex dept;
run;
결과입니다.
'DATA='는 순서화하려는 SAS 자료의 이름을 지정하고, 'OUT = '다음에는 순서화된 새로운 자료의 이름을 지정합니다. BY문에서 지정하는 변수(들)에 대한 데이터 값을 기준으로 관측을 순서화합니다.
OUT을 지정하지 않으면 기존의 데이터가 없어지고 순서화된 새로운 자료로 대체됩니다.
또한, DATA와 OUT을 둘 다 지정하지 않으면 가장 최근에 사용된 데이터를 순서화하고 바로 그 이름으로 순서화된 결과를 저장합니다.
나중에 검색할 때 혼동을 피하기 위해서는 항상 DATA와 OUT을 지정하는게 좋습니다.
SET문은 이전의 DATA단계에서 만들어진 SAS 자료를 읽어 들일 때 사용합니다.
다시 새로운 데이터를 출력하는 과정에서 자료 구조의 변형, 분석에 필요한 자료만의 선별적인 처리 등이 가능합니다. SET문의 사용용도는 광범위합니다.
SET SASdatasets (options)
SASdatasets는 SET문을 이용하여 읽어 들일 데이터의 이름입니다. 경우에 따라 둘 이상의 자료를 동시에 지정할 수 있습니다.
선택사항으로 DROP문과 KEPP문입니다. DROP문은 자료에서 빼고 싶은 변수를 지정할 때 사용하며 KEEP문은 자료에 포함하고 싶은 변수를 지정할 때 사용합니다. 하지만 둘 다 동시에 사용은 불가능 합니다.
다음의 class 데이터에는 name, number, gender, dept, exam1, exam2, socre 두 변수가 있습니다.
data class;
input name $ number gender $ dept $ exam1 exam2 score;
datalines;
minyoung 1 f stat 50 50 100
minji 2 f computer 50 50 100
kongjui 6 f computer 20 40 50
patjui 3 f stat 20 45 65
heungboo 5 m computer 25 25 50
nolboo 4 m stat 29 28 57
;
run;
여기서 class 데이터를 복사하여 새로운 temp 데이터를 만드는 코드입니다.
DATA temp;
SET class;
RUN;
이 결과로 얻어진 temp 데이터는 class와 이름만 다를 뿐 완전히 동일한 자료입니다.
class로부터 2개의 새로운 데이터를 만드는데 하나(one)에는 변수 name, number, gender만을 포함시키고, 또 다른 two 데이터에는 변수 name과 score 변수만을 넣었습니다.
DATA one;
SET class (KEEP = name number gender);
RUN;
DATA two;
SET class (KEEP = name score);
RUN;
위의 one, two 2개의 데이터를 만들기 위해서 2개의 단계를 실시하였습니다.
다음과 같은 코드는 한 단계로 줄일 수 있습니다.
DATA one (KEEP = name number gender) two(KEEP = name score);
SET class;
RUN;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Lock in the best rate now before the price increases on April 1.