DATA Step 은 데이터를 읽고 기존 SAS 데이터 세트를 사양에 맞게 변경하는 데 중요합니다.
이번 게시글에서는 기존 SAS 데이터 세트에 새로운 변수를 생성하여 추가하고, 내장된 SAS 기능을 사용하여 데이터를 변환하고, 새로운 기능을 생성하고, SAS 데이터 세트의 서브셋과 연결을 수행하는 방법에 대해 알아봅니다.
R에서는 일반적으로 달러 기호 구문을 사용하여 데이터 프레임에 변수를 추가합니다.
#R
#create and new variable to the data frame
cars$wheelbase_plus_length = cars$wheelbase + cars$length
cars(cars)
#create and add new variable conditionally
mpg_city_bonus = rep(NA,length(cars$Name))
for(i in 1:length(mpg_city_bonus){
if(cars$mpg_cith[i] >=30 {mpg_city_bonus[i]=2000}
else if(cars$mpg_city[i] >= 20){mpg_cith_bonus[i]=1000}
}
cars$mpg_city_bonus = mpg_city_bonus
# SAS
DATA new-data-set-name;
LENGTH variable-a <$> # variable-a <$> # ...;
INPUT variable-a<$> variable-b ...;
DATALINES;
a1 b1 ... z1
a2 b2 ... z2
...
an bn ... zn
;
run;
SAS 데이터 세트에 변수를 추가하려면 DATA 단계부터 시작하여 데이터 이름을 지정합니다.
SET statement에 같은 이름을 입력합니다. 이 경우에도 기존 데이터 세트를 덮어씁니다.
# Duplicate the R script
data sp4r.cars;
set sp4r.cars;
wheelbase_plus_length = wheelbase+length;
run;
기존의 변수를 바탕으로 조건부 변수를 새로 생성하는 방법에 대해여 알아보겠습니다.
cars 데이터에서 MPG Highway 변수 조건 값에 따라 새로운 Bonus 변수를 생성하는 예시를 아래에서 보여주고 있습니다.
IF THEN Statement
새로운 변수를 만드는 방법 중 가장 간단한 방법으로는 IF THEN 문이 있습니다.
# SAS
data sp4r.cars;
set sp4r.cars;
bonus=2000;
if mpg_highway<20 then bonus=0;
if mpg_highway>=20 and mpg_highway<30
then bonus=1000;
run;
DATA 단계를 사용하여 먼저 새 변수인 Bonus를 초기화하고 2000으로 설정합니다.
즉, 열의 모든 요소를 2000과 동일하게 설정합니다. 다음으로 IF 문을 사용하여 값을 조건부로 변경합니다.
mpg_highway가 20 미만일 경우 보너스를 0으로 설정합니다. 마지막에는 두 번째 IF 문을 사용합니다.
카테고리 mpg_highway가 20 이상이면 AND mpg_highway가 30보다 작으면 보너스를 1000으로 설정합니다.
여러 IF Statements 를 사용하는 것은 효율적인 코딩이 아닙니다 .
ELSE IF and ELSE Statements
ELSE IF와 ELSE Statements를 사용하는 것이 여러 IF문을 사용하는 것보다 효율적입니다.
# SAS
IF expression THEN statement;
<ELSE IF expression THEN statement;>
<…>
<ELSE statement;>
기본 문법은 위와 같습니다.
# SAS
data sp4r.cars;
set sp4r.cars;
if mpg_highway<20 then bonus=0;
else if mpg_highway<30 then bonus=1000;
else bonus=2000;
run;
proc print data=sp4r.cars (firstobs=76 obs=81);
var mpg_highway bonus;
run;
DATA step에서 Bonus 변수가 생성되지 않았다는 것입니다.
첫번째 IF 문인 IF mpg_highway가 20 미만인 경우, 그 다음 보너스 변수의 첫 번째 인스턴스는 0으로 설정됩니다. 여기서 보너스 변수를 처음 볼 수 있습니다.
DATA step 에서 이번 예시에서는 bonus가 cars 데이터 세트에 없다고 가정합니다.
다음으로 첫 번째 IF 문이 사실이 아닌 경우 다음 ELSE IF 문으로 이동합니다. 그래서 만약 그것이 20보다 크다면 그리고 mpg_highway는 30 미만이고 보너스는 1000입니다. ELSE statement에 의해, Bonus 변수가 설정됩니다.
Creating Conditional Character Variables
Bonus 변수는 숫자 변수입니다. 이번에는 조건에 따른 character 변수를 생성하고자 합니다.
data sp4r.cars;
set sp4r.cars;
length type2 $ 25;
if type in ('Hybrid','SUV','Sedan','Wagon')
then type2='Family Vehicle';
else type2='Truck or Sports Vehicle';
run;
proc print data=sp4r.cars (firstobs=61 obs=64);
var type type2;
run;
car 데이터 세트를 사용하여 변수를 조건부로 확인할 수 있습니다.
새로운 변수를 Type2로 새로운 변수를 생성합니다.
Type의 변수를 유형에 따라 Type2 로 생성합니다.
Hybrid, SUV, Sedan, Wagon >> Family Vehicle이고,
Others >> Truck or Sprots Vehicle로 Type2 변수를 생성합니다.
Creating Conditional Variables with a DO Group
IF, ELSE IF 및 ELSE 문을 사용했을 때 키워드 THEN 뒤에 하나의 문만 실행했습니다.
변수를 여러 개 만들려면 어떻게 해야 할까요? 여러 번 실행해야 합니다.
DO 그룹 구문의 일반적인 형식은 다음과 같습니다.
DO 그룹은 어떻게 사용할까요? IF THEN 스테이트먼트와 같은 방법으로 시작합니다. IF를 지정합니다.
# SAS
IF expression THEN DO;
executable statements
END;
ELSE IF expression THEN DO;
executable statements
END;
ELSE DO;
executable statements
END;
Cars 데이터 세트 중 MPG High 변수를 기준으로 Bonus 변수와 Frequency 변수를 새로 생성하기 위해 Do Group을 활용해보겠습니다.
data sp4r.cars;
set sp4r.cars;
length frequency $ 12; /* 1 */
if mpg_highway<20 then do; /* 2 */
bonus=0;
frequency='No Payment';
end;
else if mpg_highway<30 then do; /* 3 */
bonus=1000;
frequency='One Payment';
end;
else do; /* 4 */
bonus=1000;
frequency='Two Payments';
end;
run;
proc print data=cars (firstobs=65 obs=68);
var mpg_highway frequency;
run;
위의 코드를 자세히 살펴보면,
1. 문자열을 만들기 위해서는 LENGTH 문이 반드시 필요합니다.
2. 첫 번째 DO 그룹에서는 고속도로 1갤런당 마일이 20마일 미만인 경우 다음을 수행합니다.
두 변수를 생성하려고 합니다. 보너스를 0으로, 빈도를 No Payment로 설정합니다. DO Group을 종료하려면 반드시 END 문을 사용합니다.
3. 다음으로, 갤런당 마일이 30마일 미만이고 20마일 이상이면 다음을 설정합니다. Bonus 변수는 1,000이고 빈도는 one payment입니다.
4. 그렇지 않으면 보너스는 1,000이고 frquency는 Two Payment입니다.
Creating and Using Functions
이번에는 함수를 이용해 새로운 변수를 생성하는 방법에 대해 알아보겠습니다.
함수란 어떠한 값을 넣었을 때, 새로운 값을 만드는 틀이라고 이해하시면 됩니다.
Creating a New Variable with R and SAS
# R Functions
기본 문법은 아래와 같습니다.
new-variable = FUNCTION(arguments);
#create new function
mydivision = function(num,den){
val = rep(NA, length(den))
for(i in 1:length(den)){
if(den[i] == 0) {val[i]=0}
else {val[i] = round(num[i]/den[i])}
}
return(val)
}
분자와 분모의 2개의 인수를 사용하여 R에서 mydivision이라고 하는 함수를 생성합니다.
그렇지 않으면 분자의 값을 분모로 나눈 값이 반환됩니다.
DATA statement를 보면 SET statement를 가지고 있습니다.
log_price는 msrp 변수에 log를 적용하여 새로운 변수를 생성합니다.
즉, 변수 내의 모든 요소의 로그를 가져옵니다.
# SAS Functions
data sp4r.cars;
set sp4r.cars;
log_price = log(msrp);
run;
SAS의 대부분의 기능은 R에서 예상하는 것과 동일하게 작동합니다.
예를 들어, EXPENTIE, LOG, SQUARE ROOT, ROUND, CHEILING, FLOOR 등 모두 동일한 방식으로 작동하므로 변수의 모든 요소에 해당 연산이 적용됩니다.
이외에도 SAS에서 제공하는 기본적인 함수들이 있습니다.
*주의) SAS에서는 제곱의 의미로 '^' 대신 '**'을 사용합니다.
Mean Function Example
SAS에서 기본적으로 제공하는 함수 중 하나인 Mean 함수를 이용해 새로운 변수(variable)을 만들어보겠습니다.
data sp4r.cars;
set sp4r.cars;
mean_mpg = mean(mpg_highway,mpg_city);
run;
위의 코드는 cars 데이터셋 중 mpg_highway 변수와 mpg_city 변수의 평균으로 mean_mpg 변수를 생성하는 것 입니다.
DATA NULL Step
위의 MEAN 함수를 사용하는 것은 summary statistics 를 빠르게 찾는 가장 효율적인 방법이 아닙니다. 더 나은 방법은 데이터를 사용하는 것입니다.
더 나은 방법은 'NULL'을 사용하는 것인데, 특정 유형의 작업을 수행하기 위해 SAS 데이터를 생성하거나 변경하지 않아도 됩니다.
data _NULL_;
a=mean(1,2,3,4,5);
b=exp(3);
c=var(10,20,30);
d=poisson(1,2);
put a b c d;
run;
위의 코드를 자세히 살펴보면,
변수 a를 만들고 목록의 평균과 같은 값을 설정합니다. b는 e와 같습니다.
c는 10, 20 및 30의 분산입니다. d는 누적 포아송 분포이며, 포아송 분포는 다음과 같습니다.
파라미터는 1이고 값은 2입니다.
데이터 세트를 생성하지 않기 때문에 이러한 변수를 실제로 보려면 PUT를 사용해야 합니다.
출력된 결과에 나타나듯이 SAS는 이러한 정보를 로그에 기록하도록 지시합니다.
Manipulating Character Variables
이전까지는 숫자 데이터를 조작하는 방법을 알아보았습니다. 이번에는 Charater(문자) 데이터를 조작하는 방법에 대해서 알아보겠습니다. SAS에서는 Character 데이터를 조작하기 위해 Built-in Function으로 SUBTR, LENGTH, PROPCASE, SCAN 등이 있으며 DATA step에서 조작할 수 있습니다.
아래의 표는 문자변수를 다루는 함수를 설명한 것 입니다 .
SCAN Function
NewVar = SCAN (string, n <,charlist>);
여러가지 Function 중 SCAN Function 을 알아보겠습니다 .
SCAN Funtion은 특정 Delimiter(구분자)를 기준으로 문자변수 중 일부를 추출하는 것 입니다
단어의 상대적 순서가 알려진 경우 문자 값에서 단어를 추출하는 데 사용됩니다.
기본 delimiter(구분자)는 공백입니다. SCAN 기능을 사용하는 경우 다음 조건이 있습니다.
문자열에 n개 미만의 단어가 있을 경우 결측값이 반환됩니다.
n이 음수인 경우 SCAN 함수는 다음 문자열의 끝에서 시작하는 단어를 선택합니다.
스트링
생성된 변수의 길이는 SAS 9.4에서 시작하는 첫 번째 인수의 길이입니다.
생성된 변수의 길이는 SAS 9.3 이전에서는 200바이트입니다.
첫 번째 단어 앞에 구분 기호를 붙이면 효과가 없습니다.
문자 또는 문자 집합은 구분자로 사용할 수 있습니다.
2개 이상의 연속된 딜리미터는 1개의 딜리미터로 취급됩니다.
이름이라는 데이터 세트가 있다고 가정합니다.이 데이터 세트에는 데이터베이스 내의 직원 이름이 포함됩니다. 첫 번째 데이터 세트의 이름은 Farr, Sue이고, FName이라는 새로운 변수를 만들고 싶습니다.
이름 변수에서 두 번째 단어를 꺼내는 코드는 아래와 같습니다.
FName = scan(Name,2,',');
함수는 Name 변수(문자열)를 전달하여 추출할 단어를 지정합니다.
대소문자, 두 번째 단어, 마지막 인수는 구분자일 뿐입니다.
이 예의 delimiter는 쉼표이고 DATA 스텝 내에서 이 문을 실행하면 FName은 Sue가 됩니다.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!