BookmarkSubscribeRSS Feed

[SAS 활용 노하우] R VS SAS Part4

Started ‎03-25-2022 by
Modified ‎03-25-2022 by
Views 413

 

Creating Functions for the DATA Step

함수 정의는 FUNCTION문으로 시작하고 ENDSUB문으로 끝납니다. SAS 함수는 인수를 받아들이고, 계산 또는 기타 연산을 수행하고, 문자 또는 숫자 값을 반환하는 루틴입니다.

구문은 R 함수와 매우 유사합니다. FUNCTION 문 뒤에는 함수 이름과 괄호 안의 인수가 옵니다. 그리고 각 함수는 RETURN 문을 사용하여 함수 출력을 식별합니다.

SAS에는 DATA 단계에서 사용할 수 있는 수많은 내장 함수가 있습니다. 물론 사용하려는 모든 기능이 없을 수도 있습니다.

그렇게 하려면 FUNCTION COMPILER 프로시저(PROC FCMP)를 사용합니다. 여기에서 생성한 모든 함수는 DATA 단계 내에서 사용됩니다.

# R

 

function.name = function(arg1, arg2 ...){
           programming.statemetns
           return(arguments)
}

 

# SAS

 

SAS에서는 FUNCTION 문으로 시작한 다음 사용할 함수 이름을 지정합니다.

 

PROC FCMP OUTLIB=libref.data-set.package;
FUNCTION function-name(argument-1 <$>,...,
argument-n <$>) <$>; <length ;>
programming-statements;
RETURN(expression);
ENDSUB;
QUIT;

입력 인수가 문자 값이면 달러 기호 연산자가 필요합니다. 입력 인수를 지정할 때 괄호 바로 뒤에 생성하는 출력 값도 문자 값이면 달러 기호 연산자를 다시 사용해야 합니다.

PROC FCMP에는 RETURN 문이 필요하며 실제로 반환하려는 값을 전달해야 합니다.

여기서는 단일 값만 반환할 수 있습니다.

PROC FCMP에서 생성한 기능을 저장하기 위해 PROC FCMP에서 OUTLIB 옵션을 사용합니다.

패키지는 고유한 이름을 가진 루틴 모음입니다. OUTLIB 옵션의 두 번째 및 세 번째 인수는 선택한 이름입니다.

# SAS - PROC FCMP

 

PROC FCMP 문의 예를 살펴보겠습니다.

 

proc fcmp outlib=work.functions.newfuncs;    /*1*/
function ReverseName(name $) $;              /*2*/
length newname $ 40;                         /*3*/
newname=catx(' ',scan(name,2,','),scan(name,1,',')); /*4*/
return(newname); /*5*/
endsub; /*6*/
quit;

1. newfuncs 패키지에 설정된 함수 DATA의 sp4r 라이브러리에 이 함수를 저장합니다.

newfuncs 패키지는 고유한 이름을 갖고 work.functions에 저장되는 루틴 모음입니다.

2. 다음으로 FUNCTION 문이 있으며 이 함수를 ReverseName이라고 부릅니다. 문자이므로 괄호 뒤에 달러 기호가 필요합니다.

3. newname은 최대 40자입니다.

4. CATX 함수와 동일한 newname 변수를 생성합니다. 첫번째 인수는 공백일 뿐인 구분 기호입니다. 그런 다음 입력 인수를 스캔합니다.

두 번째 단어이고 이러한 단어가 쉼표로 구분된다고 가정합니다. 첫 번째 단어와 두 번째 단어를 연결합니다.

5. RETURN 함수를 사용해서 새로운 변수 값을 반환합니다.

6. ENDSUB 문을 사용해서 Function을 마무리합니다.

 

 

 

ACCESSING Newly Defined Functions

위의 예제에서는 ReverseName 함수를 생성했고 이 함수를 다시 사용하려고 합니다.

이를 위해 다음 구문과 같이 OPTIONS 문과 CMPLIB 옵션을 사용합니다.

# SAS

 

CMPLIB=libref.data-set | (libref.data-set-1 ... libref.data-set-n)

위는 R의 라이브러리 함수와 동일합니다. CMPLIB 옵션은 SAS에게 함수의 압축을 풀도록 지시합니다.

함수의 DATA 세트에 있는 라이브러리에 있습니다. OPTIONS 문으로 함수의 압축을 풀면

해당 패키지의 모든 기능을 사용할 수 있습니다.

CMPLIB= SAS 시스템 옵션은 SAS가 사용자 정의 함수 항목을 검색하는 하나 이상의 데이터 세트를 지정합니다.

기본값은 아래 예제 함수에 표시된 대로 work.functions입니다.

 

 

options cmplib=work.functions;

 

 

OPTIONS 문은 하나 이상의 SAS 시스템 옵션 값을 지정하거나 변경합니다.

예를 들어, 일반적으로 행 크기를 72로 설정하려면 아래의 명령문을 설정하면 됩니다.

 

options nodate linesize=72

 

 

 

Using User-Defined Functions

school이라는 데이터 세트가 있고 이름에 대해 FLName이라는 새 변수를 추가하려고 한다고 가정합니다. 아래의 예시에서 ReverseName 함수를 사용하여 변수 이름을 전달하는 함수를 생성합니다.

 

image.png

 

options cmplib=work.functions;
data sp4r.school;
set sp4r.school;
FLName=ReverseName(name);
run;

 

Names 변수에서 데이터는 "Bakerman, Jordan"입니다.

이름의 순서를 바꿉니다. PROC FCMP로 생성한 ReverseName 함수를 기반으로 하는 새로운 값 "Jordan Bakerman"이 출력합니다.

 

 

Subsetting Data

DATA 단계를 사용하여 조건부로 새 SAS 데이터 세트에 대한 열, 행 및 관찰의 하위 집합을 지정하는 방법을 배웁니다.

# R

 

# IDENTIFY THE UNIQUE LEVELS OF THE CHARACTER VALUED VARIABLES
MAKE = LEVELS(CARS$MAKE)
TYPE = LEVELS(CARS$TYPE)
ORIGIN = LEVELS(CARS$ORIGIN)

#CREATE A LIST OF THE CHARACTER VALUED VARIABLES
MY_LIST = LIST(MAKE,TYPE,ORIGIN)

#CREATE A DATA FRAME FOR CARS FROM ASIA
ASIA = CARS[CARS$ORIGIN =='ASIA',]
ASIA = DATA.FRAME(ASIA$NAME ,ASIA$TEAM, ASIA$HOME_RUNS)

#CONCATENATE THE BOSTON AND MONTREAL DATA FRAMES
BOS_MON = RBIND(ASIA, EUROPE) 

 

 

SUBSETTING BY COLUMN: KEEP = OPTION

# SAS

 

DATA new-data-table-name (KEEP=variable1 variable2 ...);
SET old-data-table-name;
RUN;

 

SAS에서 변수를 부분집합을 구하는 방법을 알아보고자합니다.

CARS 데이터에서 원산지가 ASIA, EUROPE인 자동차 데이터 행을 함께 결합하여 새로운 SAS 데이터 세트를 생성합니다.

# SAS

 

data sp4r.cars2 (keep=make msrp invoice);
set sp4r.cars;
run;

 

CARS 데이터 세트에서 car2라는 새로운 데이터 세트를 생성하고 있습니다.

그리고 옵션으로 KEEP= 옵션을 사용하여 변수 make, msrp 및 invoice만 car2라는 데이터를 만듭니다.

새 데이터 세트의 하위 집합을 지정하려면 다음 구문과 같이 SET 문에서 가져올 데이터 세트와 DATA 문에서 생성 중인 새 데이터 세트를 지정해야 합니다.

 

Subsetting by Column: Drop = Option

 

data sp4r.cars2 (drop=model drivetrain);
set sp4r.cars;
run;

 

변수를 삭제하여 새 데이터 세트를 만들 수도 있습니다. 이 경우 R 데이터 프레임에서 변수를 NULL 값으로 설정하는 것과 거의 동일한 DROP 옵션을 사용할 수 있습니다.

위의 예제에서 cars2라는 데이터 세트를 만들고 모델과 드라이브 트레인을 삭제하고 다른 모든 변수를 유지합니다. 구문은 KEEP= 옵션과 거의 동일합니다. DROP=로 대체합니다.

Subsetting by Row: FIRSTOBS and OBS= Options

행별로 하위 집합을 지정하려면 다음과 같이 SET 문에서 FIRSTOBS= 및 OBS= 옵션을 사용할 수 있습니다.

 

 

# SAS

 

DATA new-data-table-name;
SET old-data-table-name (FIRSTOBS=# OBS=#);
RUN;

 

자동차 데이터 세트에서 25번부터 50번까지의 관측치를 새 cars2 데이터 세트에 넣습니다.

# SAS

 

data sp4r.cars2;
set sp4r.cars;
where mpg_city > 35;
run;

KEEP=, DROP=, FIRSTOBS= 및 OBS= 옵션을 WHERE 문과 결합하여 열과 행에 따라 조건부로 데이터를 부분집합할 수 있습니다.

Subsetting by Query: PROC SQL

# SAS

 

PROC SQL;
CREATE TABLE new-data-table-name AS
SELECT UNIQUE variable-name FROM old-data-table-name;
QUIT;

 

sp4r 라이브러리에 origin이라는 새 테이블을 만들고 AS 키워드를 사용합니다.

이전에 본 것과 똑같은 구문을 사용하여 origin이라는 새 테이블을 만들고 선택할 수 있습니다.

자동차 데이터 세트의 원본에서 고유한 관찰. 여기에서 원하는 만큼 CREATE TABLE 문을 사용하여 원하는 만큼 새 데이터 세트를 생성할 수 있습니다.

 

# SAS

 

proc sql;
create table sp4r.origin as
select unique origin from sp4r.cars;
quit;

 

CREATE TABLE 문을 지정하여 단일 SQL에서 여러 데이터 세트를 생성할 수 있습니다.

SELECT DISTINCT stament는 SELECT UNIQUE statement와 동일합니다.

Version history
Last update:
‎03-25-2022 09:12 AM
Updated by:
Contributors

sas-innovate-white.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.

 

Early bird rate extended! Save $200 when you sign up by March 31.

Register now!

Article Labels
Article Tags