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

【SAS Statement】 SET 구문

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

포스팅 목차

     SET 구문

     


    1. 목 적 

       SET 구문은 하나 이상의 SAS 데이터 세트에서 관측치를 읽는다. SET 구문이 실행되면 SAS는 프로그램 데이터 벡터(PDV)에 하나의 관측치를 반복하여 읽는데, 만약 다른 명령을 지시하지 않은 경우에 SET 구문은 입력 데이터세트의 모든 변수와 모든 관측치를 읽는다. SET 구문에는 다수의 데이터 세트를 포함할 수 있고, 또한 데이터 스텝에 다수의 SET 구문을 포함할 수 있다.

     


    2. 문 법 


    SET
     <SAS-data-set(s) <(data-set-options(s) )>><options>;


    1) 인수 사용하지 않음

       인수를 지정하지 않은 경우에, SET 구문은 가장 최근에 생성된 데이터세트에서 관측치를 읽는다.

     

    2) SAS-data-set (s)

       1단계 또는 2단계 데이터 세트 이름 또는 특별한 SAS 데이터세트 이름 중에서 하나의 방법을 선택하여 데이터 세트 이름을 지정한다. 데이터세트 리스트를 사용하여서 다수의 데이터 세트를 지정할 수도 있다. SAS 9.3 이후 버전에서는 데이터 세트 이름 대신에 운영시스템 환경이 이해하는 파일의 물리적 경로명을 직접 지정할 수 있는데, 경로명은 단일 또는 이중 인용부호 안에 작성해야 한다.

    Tip : 데이터세트 리스트를 지정 있다. 상세한 정보는 “SET 구문과 데이터세트 리스트 사용 참조
    Tip :
    (SAS 9.3 기준)
    데이터 세트 이름 대신에, 운영시스템 환경이 이해하는 파일의 물리적 경로명을 직접 지정 있다. 경로명은 단일 또는 이중 인용부호 안에 작성해야 한다.
    관련사항 : SAS 데이터세트 이름의 단계와 단계별로 사용하는 시기에 대한 설명은 SAS Language Reference 에서 “SAS Data Sets” 참조
    주요기능 : “SET 구문과 데이터세트 리스트 사용참조

     

    3) (data-set-options)

       프로그램 처리를 위하여 프로그램 데이터벡터(PDV)에 변수 또는 관측치를 읽는 경우에 추가적으로 수행할 수 있는 작업 내용을 지정한다. 데이터세트에 적용하는 데이터세트 옵션은 변수 리스트에 나열된 모든 데이터 세트에 적용된다.

    Tip : 데이터세트에 적용하는 데이터세트 옵션은 변수 리스트에 나열된 모든 데이터 세트에 적용된다.

     

    4) SET 구문 옵션

       (1) END=variable

         파일의 끝(End-of-file)을 표시하는 임시 변수를 생성하도록 지정한다. 초기값이 0으로 설정된 변수는 SET 구문이 나열된 데이터 세트 중에서 마지막 데이터 세트의 최종 관측치를 읽을 때에 1로 설정된다. 기본적으로 출력 데이터세트에 출력되지 않는다. 랜덤(Random) 접근 방식을 사용하는 경우에 END= 변수는 1로 설정되지 않으므로 END= 옵션은 POINT= 옵션을 함께 사용할 수 없다.

    제한사항 : END POINT= 옵션을 함께 사용 없다. 랜덤(Random) 접근 방식을 사용하는 경우에 END= 변수는 1 설정되지 않는다.
    영향 : BY 구문을 사용하는 경우에는, END= 옵션은 SET 구문의 데이터 세트에 대하여 BY 변수를 기준으로 끼워넣기(interleaved) 작업을 수행하는 마지막 관측치를 읽을 때에 1 설정된다. 
    주요기능 : 예제11 : 모든 관측치를 읽은 후에 관측치를 작성하기

     

       (2) KEY=index

    index 변수 또는 key의 값을 기반으로 구축된 SAS 데이터 세트의 관측치에 대하여 비순차적 접근 방식으로 접근한다. 읽기 위한 데이터 세트에 단순 또는 복합 인덱스의 이름을 지정해야 한다. KEY= 옵션은 POINT= 옵션과 함께 사용할 수 없다.

    범위 : 읽기 위한 데이터 세트에 단순 또는 복합 인덱스의 이름을 지정하라.
    제한사항 : KEY= POINT= 옵션과 함께 사용 없다.
    Tip : SYSRC 자동호출 매크로와 _IORC_ 자동변수를 함께 사용하면 다른 방식 보다 많은 에러를 관리하기 위한 정보를 제공 받을 있다. KEY=옵션과 SET 구문을 함께 사용 경우에 자동변수 _IORC_ 생성된다. 자동변수는 SAS 데이터세트에서 가장 최근 관측치에 수행되는 I/O 작업의 상태를 확인 있는 반환 코드를 생성한다. 데이터 세트에서 KEY= 값에 의해 전달받은 값을 발견하지 못하면, _IORC_변수는 SYSRC 자동호출 매크로에 의하여 제공되는 기호코드 (mnemonic) _DSENOM 상태값을 반환하고, 자동변수 _ERROR_ 값을 1 설정한다.
    주요기능 : 예제7 : 테이블 검색(LOOKUP) 작업하기
    예제 8 : 기준(Master) 파일이 중복 관측치를 소유하는 경우에 테이블 검색 작업 수행
    관련사항 : 상세한 정보는 SAS Macro Language: Reference 에서 "autocall macro SYSRC 설명" 참조
    관련사항 : UNIQUE 옵션
    경고 : KEY=옵션을 사용하는 경우에 무한 반복 상태가 발생 있다.

    기준(Primary- 번째) 데이터세트를 사용하지 않고 KEY= 옵션을 사용하는 경우에는 DATA 스텝 처리를 중지시키기 위하여 다음과 같은 추가 작업이 필요하다. 아래 작업을 추가하지 않으면 무한 반복 상태가 발생 있다.

    - STOP 구문 추가
    - SYSRC 자동호출 매크로와 _IORC_ 자동변수를 사용하여서, _IORC_ 변수에 대한 유효하지 않은 값을 체크하는 프로그램 로직 추가
    - 또는 위의 양쪽 작업을 동시에 추가

     

       (3) INDSNAME=variable

         현재 읽고 있는 관측치가 포함되어 있는 SAS 데이터세트의 이름을 저장하기 위한 변수를 지정한다. 데이터세트 이름 또는 물리적 이름이 저장될 수 있다.

    Tip : SAS 데이터 세트 이름을 저장하는 경우에 SAS 변수값에 라이브러리 이름을 추가하여서(, WORK.PRICE), 2단계 이름을 대문자로 변환하여 저장한다.
    Tip : 만약 이전에 변수의 길이가 정의되지 않았으면, 변수의 길이는 41바이트로 설정된다. 파일 이름이 41 바이트보다 경우에 LENGTH 구문을 사용하여 물리적 파일 이름의 값을 저장 있도록 변수의 길이를 충분하게 설정하라.

    변수가 이전에 특정 길이의 문자변수로 정의되었으면, 길이는 변경되지 않는다. INDSANE 변수에 저장되는 값이 설정된 길이(length) 보다 길면, 값이 절단되어서 저장된다.
    변수가 이전에 숫자변수로 정의되었으면, 에러가 발생 것이다.
    주요기능 : 예제12 : 현재 읽고 있는 관측치의 데이터세트 이름 검색하기

     

       (4) NOBS=variable

         입력 데이터세트 또는 데이터세트에 대한 관측치의 총 개수가 저장되는 임시변수를 생성한다. 다수 데이터세트가 SET 구문에 나열되면, NOBS=는 데이터세트에 나열된 관측치의 총 개수를 저장한다. 관측치의 개수에는 삭제를 위하여 표시되었으나 아직 실질적으로 삭제되지 않은 관측치도 포함된다. NOBS= 옵션과 POINT= 옵션은 서로 독립적으로 함께 사용되지 않는다.

    제한사항 : SAS (VIEW) 대하여는 관측치의 개수를 정의 없다. 이런 경우에 운영환경에서 활용되는 가장 양의 정수값을 NOBS= 변수의 값으로 설정한다.
    Tip : 컴파일 시점에 SAS 개별 데이터세트의 기술 정보(descriptor) 영역을 읽어서 NOBS= 변수의 값을 자동적으로 할당한다. 그러므로, SET 구문이 실행되기 이전에 NOBS= 변수를 참조하여 사용 있다. 변수는 데이터스텝에서 활용되지만, 출력 데이터세트에 추가되지 않는다.
    영향 : NOBS= POINT= 옵션은 서로 독립적으로 함께 사용되지 않는다.
    주요기능 : 예제10 : 마지막 관측치까지 함수 수행하기

     

       (5) OPEN=(IMMEDIATE | DEFER)

         데이터를 처리하기 위한 준비가 될 때까지 연결된 SAS 데이터세트를 OPEN(여는 것)하는 것을 지연시킨다. IMMEDIATE 옵션을 사용하는 경우에, KEY=, POINT=, BY 구문은 상호 배타적으로 사용된다. 기본값은 IMMEDIATE 이다.

     

    기본값 : IMMEDIATE

     

    • IMMEDIATE

    컴파일 단계 동안에, SET 구문에 나열된 모든 데이터세트를 OPEN 한다.

    제한사항 : IMMEDIATE 옵션을 사용하는 경우에, KEY=, POINT=, BY 구문은 상호 배타적으로 처리된다.
    Tip : 번째 이후의 데이터세트의 변수의 유형이 번째 데이터세트에서 동일한 이름을 가지는 변수의 유형과 다르면(예를 들어, 문자변수와 숫자변수), 데이터 스텝은 처리를 중지하고 에러메시지를 산출한다.

     

    • DEFER

         컴파일 구문 동안에 처음 데이터 세트를 열고, 실행 단계에서 그 이후의 해당 데이터 세트를 연다. 데이터 스텝이 현재 데이터세트의 모든 관측치를 읽고 처리한 후에 현재 데이터세트를 CLOSE하고, 리스트에서 다음 데이터세트를 OPEN하여 처리하는 방식으로 진행한다.

         DFFER 옵션을 지정한 경우에, KEY= 옵션, POINT= 옵션 또는 BY 구문을 사용할 수 없다.

    제한사항 : DFFER옵션을 지정한 경우에, KEY= 옵션, POINT= 옵션 또는 BY 구문을 사용 없다.
    옵션(KEY, POINT, BY) 사용하여 처리되는 랜덤(random) 접근 방식 또는 데이터 세트 관측치 끼워넣기(interleaving) 작업은 모든 데이터세트가 OPEN 되어야 처리가 가능하다.
    필요사항 : 변수의 집합을 처리하기 위하여 DROP=, KEEP=, RENAME= 데이터세트 옵션을 사용 있지만, 개별 데이터세트에 대해 처리되는 변수들은 모두 동일해야 한다. 대부분의 경우에, 만약 처음 데이터세트에서 정의된 변수와 이후 데이터세트에서 정의된 변수의 집합이 다른 경우에, SAS 로그에 경고 메시지를 출력 하지만 실행을 중지하지는 않는다. 일부 조건에 대하여 실행을 중지한다.
     
    1.   번째 이후의 데이터세트의 변수 유형이 번째 데이터 세트에서 동일한 이름을 가지는 변수의 유형과 다르면(예를 들어, 문자변수와 숫자변수), 데이터 스텝은 처리를 중지하고 에러 메시지를 산출한다.
     
    2.   번째 이후의 데이터세트의 변수가 SET 구문의 번째 데이터 세트에 존재하지 않고 데이터스텝 프로그램에서 사전에 정의되었으면, 데이터스텝은 처리를 중지하고 에러메시지를 산출 것이다. 이런 경우에, 번째 데이터세트의 번째 관측치가 처리 때에 SET 구문의 기본 작업 방식에서는 (IMMEDIATE옵션) 사전에 설정된 변수를 결측값으로 설정하지만, DEFER 옵션에서는 (에러를 발생하고) 사전에 설정된 변수를 결측값으로 변경하지 않는다.

     

       (6) POINT=variable

         읽기 위한 관측값의 번호를 표시하기 위한 수치형 값으로 구성된 임시변수를 지정한다. POINT= 옵션은 SET 구문의 SAS 데이터세트를 읽기 위하여 랜덤(직접) 접근 방식을 사용하도록 한다. 즉, 관측치 번호를 지정하여서, 관측치에 직접 접근하여 읽을 수 있다.

    필요사항 : STOP 구문
    제한사항 : BY 구문, WHERE 구문 또는 WHERE= 데이터세트 옵션 POINT= 옵션을 함께 사용 없다. 부가적으로, TRNASPORT 출력형식 데이터세트, 테이프 또는 디스크에서 순차적 출력형식의 데이터세트, 외부파일에서 데이터를 읽는 SAS/ACCESS 또는 SQL 프로시져 (VIEW) POINT= 함께 사용 없다.
    제한사항 : POINT= KEY= 함께 사용 없다.
    Tip : POINT= 변수의 값을 제공해야 한다. 예를 들어, DO 구문의 일부 형태에서 관측치의 번호를 지정하는 POINT= 변수로 DO 반복 구문의 INDEX변수를 사용 있다.
    Tip : POINT=변수는 데이터 스텝 어디서나 사용 있지만, 출력 SAS 데이터세트에 추가 되지 않는다.
    주요기능 : 예제6 : 단일 관측치 결합하기
    예제9 : 직접(Direct) 접근 방식을 사용하여 데이터 세트 일부 읽기
    경고 : POINT=옵션을 사용하는 경우에 무한 반복 상태가 발생 있다. POINT=옵션을 사용하는 경우에 데이터스텝 처리를 중지하기 위하여 STOP 구문이나 POINT= 변수의 잘못된 값을 체크하는 프로그램 로직을 지정하거나 또는 양쪽 모두를 함께 지정해야 한다. 파일을 순차적으로 읽는 경우에 파일 (end-of-file) 표시를 읽을 있지만, POINT= DO 구문에서 지정된 관측치만을 읽기 때문에 파일의 표시를 읽을 없다. 일반적으로 파일 (end-of-file) 표시를 읽으면 자동적으로 데이터스텝을 종료하지만, 데이터에 직접 접근하는 POINT= 옵션을 사용하는 경우에는 무한 반복 상태를 방지하기 위하여 다른 방지책이 필요하다. POINT= 변수에 대하여 유효하지 않은 값을 읽으면, 자동변수 _ERROR_ 1 설정한다.
     
    DO 반복문 처리를 계속하기 위한 조건을 검사하기 위하여 프로그램 로직을 사용하거나, 데이터스텝의 종료 시점에 STOP 구문을 지정하거나 또는 양쪽 문장을 함께 사용하라.

     

       (7) UNIQUE

         KEY= 옵션에 지정된 값에 대한 검색을 수행 시 대상 데이터세트에 설정되어 있는 인덱스의 상단에서 항상 다시 검색을 시작하도록 지정한다. UNIQUE는 KEY=인수와 함께 사용되고, 슬래쉬(/) 뒤에 작성해야 한다.

    제한사항 : UNIQUE KEY=인수와 함께 사용되고, 슬래쉬(/) 뒤에 작성해야 한다.
    영향 : 기본적으로 SET 구문은 KEY= 인수에 전달되는 값이 변경되는 경우에 인덱스의 상단에서 검색을 다시 시작한다. 그러나, 연속적으로 존재하는 중복값이 KEY= 제공되면, 가장 최근에 검색된 관측치에 해당하는 인덱스 다음에서 인덱스 검색을 시작한다. 다시 말해, 연속적으로 존재하는 중복값이 KEY= 제공되고, 인덱스가 지정된 데이터세트에서도 중복값이 존재 , SET 구문은 양쪽 테이블의 중복값에 대하여 1:1 결합을 시행한다. KEY= 전달되는 관측치가 연속적으로 존재하는 중복값이고, 전달되는 중복값의 개수가 인덱스가 지정된 데이터세트의 중복값 개수보다 많은 경우에
     
    1. 일치하는 값을 발견 때까지 1:1 결합을 시행하고,
    2. 일치하는 값을 발견하지 못하는 나머지 중복값에 대하여는 Run-time 에러가 발생한다.
     
    연속적으로 존재하는 중복값이 KEY= 제공되고, 인덱스가 지정된 데이터 세트에는 단일값이 존재하는 경우에, 중복값 중에서 번째로 KEY= 전달되는 값에 대한 검색은 성공한다. 그러나, 이후의 중복값에 대한 검색은 에러를 발생한다. 지정된 KEY= 값을 발견하지 못하므로 _IORC_ 변수는 SYSRC 자동호출 매크로에 의하여 제공되는 기호코드 _DSENOM 상태값을 반환한다. /UNIQUE 옵션을 추가하면, KEY=값에 제공되는 중복값 모두에 대한 검색이 성공 것이다. 경우에 _IORC_변수는 0 반환한다.
    주요기능 : 예제8 : 기준(Master) 파일이 중복 관측치를 소유하는 경우에 테이블 검색 작업 수행
    관련사항 : 다양한 예제는 “Combining and Modifying SAS Data Sets: Examples” 참조. 관련된 내용으로 MODIFY 구문 참조

     

    3. 범 주

    SAS 기본 구문 (파일 처리 구문)

     


    4. 상세설명

     

    1)  SET 구문의 역할

    SET 구문이 실행 마다 SAS 프로그램 데이터 벡터(PDV) 하나의 관측치를 읽는다. 만약 다른 명령을 지시하지 않은 경우에 SET 구문은 입력 데이터세트의 모든 변수와 모든 관측치를 읽는다. SET 구문에는 다수의 데이터 세트를 포함 있고, 데이터 스텝 역시 다수의 SET 구문을 포함 있다.

     

    2) 사용방법

       SET 구문은 프로그램에서 다양한 형태의 사용 방법을 제공하는데, 아래의 사용 방법은 SET 구문과 함께 사용되는 옵션과 SAS 문장에 의해 정의된다.

    • 기존에 존재하는 SAS 데이터세트에서 관측치와 변수를 읽어서 새로운 데이터 스텝 처리에서 사용한다.
    • 데이터세트 상하데이터결합 작업과 끼워넣기 작업(interleaving) 및 데이터세트의 1:1 가로결합 작업을 수행한다.
    • 직접(Direct) 접근 방법을 사용하여 SAS 데이터세트 읽기

     

    3) SET 구문과 데이터세트 리스트 사용

       SET 구문에서 데이터 세트 리스트를 사용할 수 있는데, 데이터세트 리스트는 기존에 존재하는 데이터세트를 편리하게 그룹 단위로 지정할 수 있도록 한다. 이 데이터세트 리스트는 이름 접두어 리스트 또는 범위 부여 리스트 방식으로 지정해야 한다.

     

      이름 접두어 리스트 방식은 지정된 문자열로 시작하는 모든 데이터세트를 참조한다. 예를 들어, set SALES1:; 은 SALES1, SALES10, SALES11, SALES12 과 같이 “SALES1”으로 시작하는 모든 데이터 세트를 읽는다.  ("이름 첨자 리스트 방식:SET 구문")

     

       범위 부여 리스트 방식은 변수명의 마지막에 위치하는 수치형 문자를 제외하고 같은 이름을 가지는 데이터 세트의 연속적인 숫자로 구성된 데이터 세트를 참조한다. 범위 부여 범위리스트 방식에서, 임의의 숫자로 시작하여 임의의 숫자로 끝나는 범위를 지정할 수 있다. 예를 들어, 다음 리스트는 동일한 데이터세트를 참조한다.

     

    SAS Statements
    sales1 sales2 sales3 sales4
    
    sales1-sales4

     

    3) SET 구문과 BY-Group 처리

       SET 구문에는 하나의 BY 구문을 사용할 수 있다. BY 구문은 적용되는 SET 구문 바로 뒤에서 작성해야 하며, SET 구문에 나열된 데이터세트는 BY 구문에 나열된 변수로 사전에 정렬되거나 적당한 인덱스(Index)가 존재해야 한다. BY 구문을 사용하는 경우에 SET 구문은 데이터세트 끼워넣기 작업을 수행한다. 새로운 데이터세트의 관측치는 BY 구문에 나열된 변수로 정렬되고, 각 BY 그룹 내에서는 관측치가 발생하는 데이터세트의 순서로 정렬된다.

     

    참고 : 처음 데이터세트 이름에서 숫자 첨자의 부분에 0 포함하면, 마지막 데이터 세트 이름에서 숫자 첨자의 자리수는 처음 데이터 세트의 숫자 첨자 자리수 보다 크거나 같아야 한다. 그렇지 않으면, 에러가 발생하다. 예를 들어, 데이터세트 리스트 sales001-sales99 sales01-sales9 에러가 발생한다. 데이터세트 리스트 sales001-sales999 올바른 사용 방식이다. 처음 데이터세트 이름에서 숫자 첨자의 부분에 0 포함하지 않으면, 처음과 마지막 데이터세트 이름에서 숫자 첨자의 자리수는 동일하지 않아도 된다. 예를 들어, 데이터세트리스트 sales1-sales999 유효한 방식이다.

     

    범위 부여 데이터세트 리스트를 사용 때에 고려 일부 규칙은 다음과 같다.

     

    • 다수의 범위 그룹을 지정 할 수 있다.
    SAS Statements
    set cost1-cost4 cost11-cost14 cost21-cost24;

     

    • 범위 부여 리스트와 이름 첨자 리스트를 함께 사용 할 수 있다.
    SAS Statements
    set cost1-cost4 cost2: cost33-37;

     

    • 단일 데이터 세트와 데이터 세트 리스트를 함께 사용 할 수 있다.
    SAS Statements
    set cost1 cost10-cost20 cost30;

     

    • 데이터 세트 리스트 주위의 인용 부호는 무시된다.
    SAS Statements
    /* 아래 두 개의 행은 동일한 작업을 수행한다. */
    set sales1 - sales4;
    
    set 'sales1'n - 'sales4'n;

     

    • 데이터 세트 이름에서 공백을 사용 할 수 없다. 만약 인용부호가 사용된다면, 후행 공백을 제거하고 사용한다.
    SAS Statements
    /* 다음 문장에서 공백 때문에 에러가 발생한다. */
    set sales 1 - sales 4;
    
    set 'sales 1'n - 'sales 4'n;

     

    SAS Statements
    /* 다음 구문에서 후행 공백은 무시 될 것이다. */
    
    set 'sales1   'n - 'sales4   'n;

     

    • 최대 숫자 첨자는 2147483647이다.
    SAS Statements
    /* 다음에 사용된 숫자 첨자는 에러를 발생 할 것이다. */
    
    set prod2000000000-prod2934850239;

     

    4) SET 구문과 BY-Group 처리

    SET 구문에는 하나의 BY 구문을 사용 있다. BY 구문은 적용되는 SET 구문 바로 뒤에서 사용되어야 한다. SET 구문에 나열된 데이터세트는 BY 구문에 나열된 변수로 사전에 정렬되거나 적당한 인덱스(Index) 존재해야 한다. BY 구문을 사용하는 경우에 SET 구문은 데이터세트 끼워넣기 작업을 수행한다. 새로운 데이터세트의 관측치는 BY 구문에 나열된 변수로 정렬되고, BY 그룹 내에서는 관측치가 발생하는 데이터세트의 순서로 정렬된다.

    참고 : SET 구문에서 BY 그룹의 예제로 예제2 : SAS 데이터 세트 끼워넣기

     

    5) SAS 데이터세트 결합

       지정된 데이터세트를 결합하기 위하여 단일 SET 구문에 여러 데이터세트를 지정하는데,  새로운 데이터세트에서 관측치 개수는 SET 구문에 나열된 데이터세트의 관측치 합계와 동일하다. 관측치의 순서는 처음 데이터세트에서 모든 관측치가 출력되고, 그 뒤를 이어서 두 번째 데이터세트의 모든 관측치가 출력되는 방식으로 이후 데이터세트를 계속 출력한다. 

    참고 : 예제1 : SAS 데이터세트결합

     

       지정된 데이터세트에 대하여 끼워넣기 작업을 수행하기 위하여 단일 SET 구문과 BY 구문을 사용해야 한다. 새로운 데이터세트의 관측치는 BY 구문에 나열된 변수로 정렬되고, 각 BY 그룹 내에서는 관측치가 발생하는 데이터세트의 순서로 정렬된다.

    참고 : 예제2 : SAS 데이터 세트 끼워넣기

     

       지정된 데이터 세트에 대하여 1:1 결합을 수행하기 위하여 다중 SET 구문을 사용해야한다. 이 경우 새로운 데이터세트는 모든 입력 데이터세트에 존재하는 모든 변수를 포함하며, 새로운 데이터세트의 관측치 개수는 가장 작은 원본 데이터세트의 관측치의 개수와 동일하게 생성된다. 데이터세트가 동일한 이름의 공통변수를 포함하면, 마지막 데이터세트에서 읽혀진 값이 이전 데이터세트에서 읽은 관측치를 대체한다.

    예제 : - 데이터 세트의 1:1 결합의 예제

    예제6 : 단일 관측치 결합하기
    예제7 : 테이블 검색(LOOKUP) 작업하기
    예제8 : 기준(Master) 파일이 중복 관측치를 소유하는 경우에 테이블 검색 작업 수행

    Combining and Modifying SAS Data Sets: Examples.
    SAS Language Reference: Concepts. 에서 "Combining SAS Data Sets: Basic Concepts"

     


    5. 비교 사항

    • SET 구문은 기존에 존재하는 SAS 데이터세트의 관측치를 읽는다. INPUT 구문은 SAS 변수와 관측치를 생성하기 위하여 외부파일 또는 내부 데이터라인을 읽는다.
    • SET 구문과 KEY= 옵션을 사용하여 전달되는 값에 따라 SAS 데이터세트에서 비순차적으로 관측치를 읽을 수 있다. SET 구문과 POINT= 옵션을 사용하여 관측치 번호에 따라 SAS 데이터세트에서 비순차적으로 관측치를 읽을 수 있다.

     


    6. 관련 구문

    구문명 구문내용
    BY 구문 데이터 세트에서 SET, MERGE, UPDATE 구문의 그룹별 관측치에 대한 처리 방식을 지정하고, 특수한 그룹화 변수를 내부적으로 생성한다.
    DO 구문 그룹 단위로 실행하기 위한 SAS 문장의 그룹을 지정하라.
    INPUT 구문 입력 데이터 레코드에서 관측치 값을 변수로 읽으려는 방법을 정의하고, 입력값을 해당 SAS 변수에 할당한다. 외부 파일 또는 내부 데이터에서 원시 데이터를 읽기 위하여 INPUT 구문을 사용한다. 
    MERGE 구문 다수의 SAS 데이터 세트의 관측치를 하나의 관측치로 결합하여 새로운 SAS 데이터 세트를 생성한다.
    MODIFY 구문 새로운 SAS 데이터 세트를 추가로 생성하지 않고 기존에 존재하는 SAS 데이터 세트의 관측치에 대하여 대체, 삭제, 추가 작업을 수행한다.
    SET 구문 하나 이상의 SAS 데이터 세트에서 관측치를 읽는다.
    STOP 구문 프로그램에서 STOP 구문이 실행되면 현재 처리 중인 데이터 스텝의 실행을 중지시킨다.
    UPDATE 구문 Master 파일의 데이터 항목을 변경 및 삽입하기 위하여 Master 파일을 기준으로 Transactions 파일의 데이터 값으로 갱신(Update) 또는 삽입(Insert) 작업을 수행한다.
    데이터 세트 옵션  

     

    • 데이터 세트 옵션 정의
    • SAS Language Reference: Dictionary에서 IN 옵션
    • "Rules for Words and Names" in SAS Language Reference: Concepts
    • "Reading, Modifying, and Combining SAS Data Sets" in SAS Language Reference: Concepts
    • SAS Macro Language: Reference
    • Combining and Modifying SAS Data Sets: Examples

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

     


    7. 예 제

     

    예제1 : SAS 데이터세트 결합

    SET 구문에 다수의 데이터세트 이름을 지정하면, 새로운 데이터세트에는 SET 구문에 나열된 모든 데이터세트의 관측치를 결합하여 생성된다. SAS 번째 데이터세트에서 모든 관측치를 읽은 후에, 번째 데이터세트에서 모든 관측치를 읽는 방식으로 이후에 나열된 데이터세트를 모두 처리한다. 다음 예제는 3개의 데이터세트를 세로-결합하여 새로운 FINESS 데이터세트를 생성한다.

     

    SAS Statements
    data fitness;
       set health exercise well;
    run;

     


    예제2 : SAS 데이터 세트 끼워넣기

    다수의 SAS 데이터 세트를 끼워넣기 작업을 수행하기 위하여 SET 구문 뒤에 BY 구문을 사용한다.

     

    SAS Statements
    data april;
       set payable recvable;
       by account;
    run;

     


    예제3 : SAS 데이터 세트 읽기

    다음은 NC.MEMBERS 데이터세트의 개별 관측치를 프로그램 데이터벡터(PDV) 읽는다. CITY 변수의 값이 'Releigh' 관측치에 대하여 RELEIGH.MEMBERS 데이터 세트에 출력한다.

     

    SAS Statements
    data raleigh.members;
       set nc.members;
       if city='Raleigh';
    run;

     

    예제4 : 단일 관측치를 SAS데이터 세트의 모든 관측치에 결합하기.

    SAS 프로시져 또는 다른 데이터 스텝에 의하여 생성된 단일 관측치를 기존에 존재하는 데이터 세트의 모든 관측치에 결합한다. AVGSALES 데이터세트는 단일 관측치를 포함 하고 있다.

     

    SAS Statements
    data national;
          if _n_=1 then set avgsales;
          set totsales;
    run;

     


    예제5 : 동일한 데이터 세트를 여러 번 읽기

    다음 예제에서 개별 SET 구문은 서로 독립적으로 작업을 수행한다. , 개별 SET 구문은 개의 서로 다른 데이터세트를 읽는 것처럼 동일 데이터세트에서 관측치를 읽는다.

     

    SAS Statements
    data drugxyz;
       set trial5(keep=sample);
       if sample>2;
       set trial5;
    run;

     

    데이터스텝의 개별 반복에서 번째 SET 구문이 하나의 관측치를 읽는다. 번째 SET 구문이 실행된 이후에, 다음 SET 구문이 관측치를 읽는다. 개별 SET 구문은 데이터스텝의 동일한 반복에서 서로 다른 관측치를 읽을 있다.

     


    예제6 : 단일 관측치 결합하기

    번째 데이터 세트에서 Region 변수의 값이 4 관측치를 선택 후에, 선택된 값의 관측치 번호를 Point= 제공하여 직접(DIRECT) 접근 방법으로 Expense 데이터세트에서 해당하는 관측치 번호의 값과 결합한다.

     

    SAS Statements
    data south;
       set revenue;
       if region=4;
       set expense point=_n_;
    run;

     


    예제7 : 테이블 검색(LOOKUP) 작업하기

    다음 예제는 테이블 검색 작업을 수행하기 위하여 KEY= 옵션을 사용한다. 데이터 스텝은 INVTORY기준(PRIMARY) 데이테세트와 PARTCODE lookup 데이터 세트를 읽는다. 개별 데이터세트에서 PARTNO 변수의 값이 일치하는 것을 찾기 위하여, PARTNO인덱스를 사용하여 비순차적으로 PARTCODE데이터 세트를 읽는다. 프로그램의 목적은 기준 데이터세트에 리스트 각각의 파트에 대하여 lookup 데이터세트에서 Partno변수를 적절하게 설명을 해주는 DESC변수 값을 삽입하는 것이다.

    SAS Statements
    data combine;
       set invtory(keep=partno instock price);
       set partcode(keep=partno desc)  key=partno;
    run;

     


    예제8 : 기준(Master) 파일이 중복 관측치를 소유하는 경우에 테이블 검색 작업 수행

    다음 예제는 테이블 검색 작업을 수행하기 위하여 KEY= 옵션을 사용한다. 데이터 스텝은 PARTNO변수를 기준으로 INVTORY 데이터세트와 인덱스가 정의된 PARTCODE 데이터 세트를 읽는다. PARTCODE 신규 재고 수량(NEW_STK 변수) 포함하고 있다. INVTORY데이터 세트에 중복 관측치가 존재한다면, UNIQUE 옵션은 NEW_STK 값이 INSTOCK 변수의 중복 관측치에 올바르게 추가되도록 한다.

     

    SAS Statements
    data combine;
     set invtory(keep=partno instock price);
     set partcode(keep=partno new_stk)
       key=partno/unique;
       instock=instock+new_stk;
    run;

     


    예제9 : 직접(Direct) 접근 방식을 사용하여 데이터 세트 일부 읽기

    다음 문장은 지정된 숫자에 해당하는 관측치 번호의 값을 직접 선택하기 위하여 POINT= 옵션을 사용하여 DRUGTEST 데이터세트에서 50 관측치를 읽는다.

     

    SAS Statements
    data sample;
       do obsnum=1 to 100 by 2;
          set drugtest point=obsnum;
          if _error_ then abort;
          output;
       end;
       stop;
    run;

     


    예제10 : 마지막 관측치까지 함수 수행하기

    다음 문장은 DO 반복문 처리에 대한 종료값을 설정하기 위하여 NOBS= 사용한다. 임시변수 LAST 값은 SURVEY1 SURVEY2 관측치 개수의 합계로 설정된다.

     

    SAS Statements
    do obsnum=1 to last by 100;
       set survey1 survey2 point=obsnum nobs=last;
       output;
    end;
    stop;

     


    예제11 : 모든 관측치를 읽은 후에 관측치를 작성하기

    다음 예제는 REVENUE변수에 값을 할당하기 위하여 END= 옵션에 대한 값을 LAST변수에 할당하여서, RENTAL 데이터 세트의 마지막 관측치를 읽은 후에 관측치를 작성한다.

     

    SAS Statements
    set rental end=last;
    totdays + days;
    if last then
       do;
          revenue=totdays*65.78;
          output;
       end;

     


    예제12 : 현재 읽고 있는 관측치의 데이터세트 이름 검색하기

    다음 예제는 SET 구문에 3개의 데이터세트를 나열하고, 데이터세트 이름을 DSN 변수에 저장한 후에 이름을 3 부분으로 구분한다.

     

    SAS Statements
    /* 읽기 위한 데이터 세트 생성 */
    data gas_price_option; value=395; run;
    data gas_rbid_option; value=840; run; 
    data gas_price_forward; value=275; run;
    /* 데이터 세트 D 생성 */
    data d;
       set gas_price_option gas_rbid_option gas_price_forward indsname=dsn;
       /* 데이터 세트 이름을 3개 부분으로 분리 */
       commodity = scan (dsn, 2, "._");
       type = scan (dsn, 3, "._");
       instrument = scan (dsn, 4, "._");
       run;
    proc print data=d;
    run;

     

     

    데이터 세트 이름은 3 부분으로 구분된다.

    Results
    The SAS System                               1
                                                     
                   Obs    value    commodity    type     instrument
                    1      395        GAS       PRICE     OPTION  
                    2      840        GAS       RBID      OPTION  
                    3      275        GAS       PRICE     FORWARD

     


    예제13 : 데이터 세트 리스트 사용하기

    다음 예제는 SET 구문에 범위 부여 리스트 형식을 사용하여서 입력데이터 세트를 나열한다.

     

    SAS Statements
    data dept008; emp=13; run;
    data dept009; emp=9; run;
    data dept010; emp=4; run;
    data dept011; emp=33; run;
     
    data _null_;
      set dept008-dept010;
      put _all_;
    run;

     

    프로그램은 SAS 로그에 다음 라인을 출력한다.

     

    [LOG 출력결과]

    Results
    1    data dept008; emp=13; run;
    NOTE: The data set WORK.DEPT008 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.06 seconds
          cpu time            0.03 seconds
         
    2    data dept009; emp=9; run;
    NOTE: The data set WORK.DEPT009 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
         
    3    data dept010; emp=4; run;
    NOTE: The data set WORK.DEPT010 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
         
    4    data dept011; emp=33; run;
    NOTE: The data set WORK.DEPT011 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
         
    5  
    6   data _null_;
    7     set dept008-dept010;
    8     put _all_;
    9   run;
    emp=13 _ERROR_=0 _N_=1
    emp=9 _ERROR_=0 _N_=2
    emp=4 _ERROR_=0 _N_=3
    NOTE: There were 1 observations read from the data set WORK.DEPT008.
    NOTE: There were 1 observations read from the data set WORK.DEPT009.
    NOTE: There were 1 observations read from the data set WORK.DEPT010.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds

     

    추가적으로, 존재하지 않는 데이터세트를 발견하기 위하여 데이터 세트 리트스를 사용 있다. 다음 예제는 존재하지 않는 데이터세트를 찾기 위하여 범위 부여 리스트 방식을 사용한다. 존재하지 않는 각각의 데이터세트에 대하여 에러가 발생한다. LOG에서 누락된 데이터세트의 목록을 확인하고, 실제 존재하는 데이터세트를 확인하여 SET 구문을 수정 있다.

    SAS Statements
    data dept008; emp=13; run;
    data dept009; emp=9; run;
    data dept011; emp=4; run;
    data dept014; emp=33; run;
     
    data _null_;
      set dept008-dept014;
      put _all_;
    run;

     

    프로그램은 SAS 로그에 다음 라인을 출력한다.

     

    [LOG 출력결과]

    Results
    1    data dept008; emp=13; run;
    NOTE: The data set WORK.DEPT008 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.04 seconds
          cpu time            0.04 seconds
         
    2    data dept009; emp=9; run;
    NOTE: The data set WORK.DEPT009 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
         
    3    data dept011; emp=4; run;
    NOTE: The data set WORK.DEPT011 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.03 seconds
          cpu time            0.01 seconds
         
    4    data dept014; emp=33; run;
    NOTE: The data set WORK.DEPT014 has 1 observations and 1 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds
            
    5    data _null_;
    6    set dept008-dept014;
    ERROR: File WORK.DEPT010.DATA does not exist.
    ERROR: File WORK.DEPT012.DATA does not exist.
    ERROR: File WORK.DEPT013.DATA does not exist.
    7    put _all_;
    8    run;
    NOTE: The SAS System stopped processing this step because of errors.
    NOTE: DATA statement used (Total process time):
          real time           0.00 seconds
          cpu time            0.00 seconds

     


     


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

     

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

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

    【SAS Statement】 Sum 구문  (0) 2022.02.07
    【SAS Statement】 STOP 구문  (0) 2022.02.05
    【SAS Statement】 SELECT 구문  (0) 2022.02.05
    [SAS Statement] SASFILE 구문  (0) 2022.02.05
    [SAS Statement] RUN 구문  (0) 2022.02.05

    댓글