본문 바로가기
SAS/SAS 구문사전

【SAS Statement】 RETAIN 구문

by 기서무나구물 2022. 2. 5.

포스팅 목차

    o RETAIN 구문

     


    1. 목 적 

       RETAIN 구문은 INPUT 구문 또는 할당문에 의해 생성된 변수의 값이 데이터 스텝의 반복이 새롭게 시작할 때마다 초기화되는 것(기본 수행 작업)을 방지하여서, 데이터 스텝의 현재 반복에서 다음 반복까지 변수의 값이 유지되도록 한다.

     

       데이터 스텝에서 기본적으로 RETAIN 구문이 사용되지 않으면 SAS는 자동적으로 데이터 스텝의 각각의 반복이 시작하기 전에 INPUT 구문 또는 할당문에 의하여 지정된 변수를 결측값으로 초기화한다.

     

       개별 변수, 변수 리스트 또는 배열 원소에 초기값을 지정하기 위하여 RETAIN 구문을 사용한다. RETAIN 구문에서 값이 존재하면, 리스트에서 그 초기값 앞에 나열된 변수들에는 해당 값이 초기값으로 설정된다. (RETAIN 구문에서 동일한 변수를 상이한 초기값으로 여러 번 할당하면, 마지막에 지정된 변수와 초기값이 사용된다.) 

     

       SUM 구문에 의하여 누적되는 누적 변수의 초기값을 기본값인 0과 다른 초기값을 할당하기 위하여 RETAIN 구문을 사용할 수 있다.

     


    2. 문 법 


    RETAIN 
      < . . . element-list-n >>;


     

    1) 인수 사용하지 않음

       인수를 별도로 지정하지 않으면, RETAIN 구문은 INPUT 구문 또는 할당문으로 생성된 모든 변수의 값이 현재 데이터 스텝의 반복에서 다음 반복까지 유지되도록 한다.

     

    2) element-list

       유지하기 원하는 값을 포함하고 있는 변수 이름, 변수 리스트, 배열 이름을 지정한다. _ALL_, _CHAR_, 또는 _NUMERIC_을 지정하면, RETAIN 구문 이전에 정의된 변수 중에서 해당하는 형태의 변수의 값을 유지한다.

    Tip : _ALL_, _CHAR_, 또는 _NUMERIC_ 지정하면, RETAIN 구문 이전에 정의된 변수 중에서 해당하는 형태의 변수의 값을 유지한다.
    Tip : 변수 이름이 (데이터 스텝에 정의되지 않고) RETAIN 구문에만 지정되고 초기값이 별도로 지정되지 않았으면, 변수는 데이터 세트에 작성되지 않는다. 그리고, 변수가 초기화 되지 않은 내용을 SAS 로그에 note 작성한다. 초기값을 지정하면, 변수는 데이터 세트에 작성된다.

     

    3) initial-value

       앞에 나열한 한 개 이상의 변수들에 할당하기 위한 수치형 또는 문자형 초기값을 지정한다. 만약 초기값을 생략하면, 결측값이 초기값으로 할당된다. 초기값은 선행하는 리스트의 모든 변수에 동일하게 할당되므로 변수 리스트에 포함된 모든 변수에는 동일한 초기값이 할당된다.

    Tip : 초기값을 생략하면, 결측값이 초기값으로 할당된다. 초기값은 선행하는 리스트의 모든 변수에 할당된다. 그러므로, 변수 리스트에 포함된 모든 변수에는 동일한 초기값을 부여한다.
    관련사항 : (initial-value) (initial-value-list)

     

    4) (initial-value)

       선행하는 단일 변수 또는 선행하는 변수 리스트의 첫 번째 변수에 수치형 또는 문자형 초기값을 지정한다.

     

    5) (initial-value-list)

       선행하는 리스트의 개별 변수에 수치형 또는 문자형 초기값을 지정한다. 변수 리스트에 존재하는 첫 번째 변수에 초기값 리스트의 첫 번째 값이, 두 번째 변수에 초기값 리스트의 두 번째 값이 할당되는 방식으로 초기값을 지정한다.

       초기값 리스트(initial-value-list)와 변수 리스트(element-list)를 함께 지정하기 위하여, RETAIN 구문에서 초기값 리스트를 변수 리스트 바로 뒤에 작성해야 한다. 다수의 초기값을 공백 또는 쉼표로 분리하여 지정할 수 있으며, 연속되는 정수의 범위를 지정하기 위하여 단축 표기법(1:n) 사용할 수 있다. 이 경우에 증가값은 +1이 된다. 문자형 초기값은 인용 부호 안에 작성해야 한다. 

       다수의 초기값을 직접 지정하기 위하여 다음 형태를 사용 할 수 있다.

     

       (1) (initial-value(s))

         초기값을 지정하기 위하여 반복 인자와 중첩된 하위리스트(Nested sublists)를 다음과 같은 형식으로 사용할 수 있다. 

    <constant-iter-value*><(>constant value | constant-sublist<)>
    제한사항 : 초기값 리스트와 변수 리스트를 함께 지정하기 위하여, RETAIN 구문에서 초기값 리스트를 변수 리스트 바로 뒤에 작성해야 한다.
    Tip : 다수의 초기값을 공백 또는 쉼표로 분리하여 지정 있다.
    Tip : 연속되는 정수의 범위를 지정하기 위하여 단축 표기법(1:n) 사용 있다. 증가값은 항상 +1이다.
    Tip : 변수와 임시 배열의 임시 데이터 원소에 초기값을 할당 있다.
    Tip : 초기값 리스트의 값들보다 변수리스트에 많은 변수가 존재하면, 할당되지 못한 나머지 변수는 결측치가 할당되고 경고 메시지가 출력된다.

     


    3. 범 주

    SAS 기본 구문 (정보 처리 구문)

     


    4. 상세 설명

    기본 데이터 스텝 동작

    데이터 스텝에서 기본적으로 RETAIN 구문이 사용되지 않으면 SAS 자동적으로 데이터 스텝의 각각의 반복이 시작하기 전에 INPUT 구문 또는 할당문에 의하여 지정된 변수를 결측값으로 초기화 한다.

     

    초기값 할당하기

    개별 변수, 변수 리스트 또는 배열 원소에 초기값을 지정하기 위하여 RETAIN 구문을 사용하라. RETAIN 구문에서 값이 존재하면, 리스트에서 초기값 앞에 나열된 변수들에는 값이 초기값으로 설정된다. (RETAIN 구문에서 동일한 변수를 상이한 초기값으로 여러 할당하면, 마지막에 지정된 변수와 초기값이 사용된다.) SUM 구문에 의하여 누적되는 누적 변수의 초기값을 기본값인 0 다른 초기값을 할당하기 위하여 RETAIN 구문을 사용 있다.

     

    자동으로 유지되어 RETAIN 구문이 불필요한 경우

    아래 항목은 데이터스텝의 해당 값을 현재 반복에서 다음 반복까지 자동적으로 유지(RETAIN)하기 때문에, RETAIN 구문에서 아래 항목에 대한 변수 이름을 지정하는 것은 불필요하다.

     

    • SET, MERGE, MODIFY 또는 UPDATA 구문에서 읽어들이는 변수 (원시 데이터를 읽는 경우에는 개별 반복의 시작에서 변수의 값을 결측값으로 초기화 한다.)
    • SUM 구문을 사용하여 누적되는 변수
    • 자동변수 : _N_, _ERROR_, _I_, _CMD_, _MSG_
    • SET, MERGE, MODIFY 또는 UPDATE 구문에서 END= 또는 IN= 옵션에 의해 생성되는 변수
    • FILE, INFILE 구문에서 변수를 생성하는 옵션에 의하여 생성되는 변수
    • 임시 배열에서 지정되는 데이터 원소
    • ARRAY 구문에서 초기화되는 배열 원소
    • ARRAY 구문에서 원소의 일부 또는 모든 값에 초기값을 할당하는 배열의 원소

     

    _N_ _ERROR_ 제외하고, 위의 항목들은 초기값을 할당하기 위하여 RETAIN 구문에서 사용 있다.

     


    5. 비교 사항

    • RETAIN 구문은 데이터 스텝의 개별 반복의 시작 시점에 해당 변수가 결측치로 설정되지 않고 유지되도록 지정한다. KEEP 구문은 생성되는 데이터 세트에 포함시킬 변수를 지정한다.

     


    6. 관련 구문

    구문명 구문내용
    할당문 등호 우측의 표현식을 평가하고, 표현식 결과값을 좌측의 새로운 변수에 저장한다.
    BY 구문 데이터 세트에서 SET, MERGE, UPDATE 구문의 그룹별 관측치에 대한 처리 방식을 지정하고, 특수한 그룹화 변수를 내부적으로 생성한다.
    INPUT 구문 입력 데이터 레코드에서 관측치 값을 변수로 읽으려는 방법을 정의하고, 입력값을 해당 SAS 변수에 할당한다. 외부 파일 또는 내부 데이터에서 원시 데이터를 읽기 위하여 INPUT 구문을 사용한다. 
    RETAIN 구문 INPUT 구문 또는 할당문에 의해 생성된 변수의 값이 데이터 스텝의 반복이 새롭게 시작할 때마다 초기화되는 것(기본 수행 작업)을 방지하여서, 데이터 스텝의 현재 반복에서 다음 반복까지 변수의 값이 유지되도록 한다.

     


    7. 예 제

    예제1 : 기본 사용법

    • RETAIN 구문은 MONTH1~MONTH5 변수의 값을 데이터 스텝의 현재 반복에서 다음 반복까지 유지되도록 한다.
    SAS Statements
    retain month1-month5;

     

    • RETAIN 구문은 9개 변수의 초기값을 지정하고 해당 값을 유지하도록 한다.
    SAS Statements
    retain month1-month5 1 year 0 a b c 'XYZ';

     

    MONTH1~MONTH5 변수는 초기값이 1 설정되고, YEAR 변수는 0으로 설정된다. A,B,C 변수의 초기값은 각각 문자형 상수값 XYZ으로 설정된다.

     

    • RETAIN 구문은 MONTH1 변수에 초기값 1을 할당한다.
    SAS Statements
    retain month1-month5 (1);

     

    MONTH2~MONTH5 변수는 초기값을 결측값으로 설정한다.

     

    • RETAIN 구문은 데이터 스텝 초기에 정의된 모든 변수의 값을 유지하지만, 정의된 이후의 값은 유지하지 않는다.
    SAS Statements
    retain _all_;

     

    • 다음 문장은 동일하게 VAR1~VAR4 변수의 모든 값에 초기값 1~4를 할당한다.
    SAS Statements
    retain var1-var4 (1 2 3 4);
    
     
    
    retain var1-var4 (1,2,3,4);
    
     
    
    retain var1-var4(1:4);

     

    예제2 : RETAIN 작동 방법 소개

    다음 예제는 RETAIN 구문에서 변수 이름과 배열 이름을 사용하는 방법과 괄호 사용여부에 따라서 초기값을 할당하는 방법을 보여준다.

     

    SAS Statements
    data _null_;
       array City{3} $ City1-City3;
       array cp{3} Citypop1-Citypop3;
       retain Year Taxyear 1999 City ' '
              cp (10000,50000,100000);
       file file-specification print;
       put 'Values at beginning of DATA step:'
           / @3 _all_ /;
       input Gain;
       do i=1 to 3;
          cp{i}=cp{i}+Gain;
       end;
       put 'Values after adding Gain to city populations:'
           / @3 _all_;
       datalines;
    5000
    10000
    ;

     

    다음은 RETAIN 구문을 사용하여 할당되는 초기값이다.

     

    • YEAR과 TAXYEAR 변수는 초기값 1999가 할당된다.
    • CITY1,CITY2,CITY3 변수는 초기값으로 결측치 값이 할당된다.
    • CITYPOP1 변수는 10000 이 할당된다.
    • CITYPOP2 변수는 50000 이 할당된다.
    • CITYPOP3 변수는 100000 이 할당된다.

     

    다음은 PUT 구문에 의해 작성되는 라인이다.

     

    [LOG 출력결과]

    Results
    Values at beginning of DATA step:
      City1=  City2=  City3=  Citypop1=10000
      Citypop2=50000 Citypop3=100000
    Year=1999 Taxyear=1999 Gain=. i=.
    _ERROR_=0 _N_=1
     
    Values after adding GAIN to city populations:
      City1=  City2=  City3=  Citypop1=15000
      Citypop2=55000 Citypop3=105000
    Year=1999 Taxyear=1999 Gain=5000 i=4
    _ERROR_=0 _N_=1
    Values at beginning of DATA step:
      City1=  City2=  City3=  Citypop1=15000
      Citypop2=55000 Citypop3=105000
    Year=1999 Taxyear=1999 Gain=. i=.
    _ERROR_=0 _N_=2
     
    Values after adding GAIN to city populations:
      City1=  City2=  City3=  Citypop1=25000
      Citypop2=65000 Citypop3=115000
    Year=1999 Taxyear=1999 Gain=10000 i=4
    _ERROR_=0 _N_=2
    Values at beginning of DATA step:
      City1=  City2=  City3=  Citypop1=25000
      Citypop2=65000 Citypop3=115000
    Year=1999 Taxyear=1999 Gain=. i=.
    _ERROR_=0 _N_=3

     

    번째 PUT 구문을 3 실행하고, 반면에 번째 PUT 구문은 단지 2 실행된다. 데이터 스텝은 INPUT 구문이 3 실행되고, 파일의 끝에 도착 했을 때에 실행을 중지한다.

     


    예제3 : 연속된 관측치에서 하나의 관측치 선택하기

    다음 예제는 BY변수에 의하여 구분되는 개별 ID 중에서 단일 관측치를 소유하는 새로운 데이터 세트 CLASS.BSESTSCOR 생성한다. ID변수의 개별 그룹에서 최대 GRADE값을 BESTSCORE데이터 세트에 출력한다.

    SAS Statements
    libname class 'SAS-library';
     
    proc sort data=class.allscores;
       by id;
    run;
     
    data class.bestscores;
       drop grade;
       set class.allscores;
       by id;
          /* 개별 반복에서 결측값으로 초기화되는 것을 방지 */
       retain highest;
          /* ID 값이 서로 다른 값으로 변경 시 HIGEST변수의 값을 결측값으로 초기화 */
       if first.id then highest=.;
          /* 현재 반복에서 HIGHEST와 GRADE의 값을 비교하여서, GRADE가 더 크면    */
          /* 값을 변경한다.                                                       */
       highest=max(highest,grade);
       if last.id then output;
    run;

     


     


    [SAS Statement] SAS 데이터 스텝 구문 사전 목록]

     

    SAS 함수(SAS Function) 리스트 링크
    반응형

    'SAS > SAS 구문사전' 카테고리의 다른 글

    [SAS Statement] RUN 구문  (0) 2022.02.05
    【SAS Statement】 RETURN 구문  (0) 2022.02.05
    [SAS Statement] RESETLINE 구문  (0) 2022.02.05
    【SAS Statement】 REPLACE 구문  (0) 2022.02.05
    【SAS Statement】 RENAME 구문  (0) 2022.02.05

    댓글