2009년 10월 13일 화요일

data step에서 macro변수 생성/사용하기

처음 쌔스를 배울때 헛갈리게 만드는 부분들 중 하나가 데이터 스텝 내에서 매크로 변수를 사용하는 것 입니다.
가끔 아래와 같이 데이터 스텝내에서 생성된 값을 매크로 변수에 할당했는데 해당 스텝내에서 다시 불러 쓰고 싶을때가 있습니다.

[예제]
%let test=5;

data _null_;
    var1 = 10;
    call symput('test', compress(var1));

    test2=&test;
    put test2=;
run;
%put [&test];

그런데 실행해 보면 test2에 5가 들어가 있습니다. 의도했던 것은 10인데 말입니다.

데이터 스텝이 실행되는 시점에 test2=&test; <-- 요부분의 매크로변수가 정해져 버려서 test2=5; 라고 들어가 버립니다.

동적으로 매크로변수를 할당해서 사용하고 싶을때는 아래와 같이 symget 함수를 사용해야 합니다.


%let test=5;

data _null_;
    var1 = 10;
    call symput('test', compress(var1));

    test2=symget('test');
    put test2=;
run;

%put [&test];

Oracle TIMESTAMP 데이터 타입 처리

SAS 9.1.3 에서 Oracle TIMESTAMP data type을 처리하려면 별도 Hox fix를 적용해야 합니다.

적용할 hot fix는 아래 E90C11, E9BB98, E9BB99 세 개 입니다.


참고로, SAS9.2에서는 Oracle TIMESTAMP data types을 정식 지원합니다.

(http://support.sas.com/documentation/cdl/en/acreldb/61890/HTML/default/a003113620.htm)


Download: E9BB80 for Windows   (File Size: 2.0M)
ATTENTION (1): Oracle customers must also download and install SAS Oracle hot fix E9OC11.
Download E9OC11
Download E9OC11 for SAS with Asian Language Support (DBCS)
ATTENTION (2): Customers running SAS Base SQL must also download and install SAS Base hot fixes E9BB98 and E9BB99.
Download E9BB98
Download E9BB98 for SAS with Asian Language Support (DBCS)
Download E9BB99
Download E9BB99 for SAS with Asian Language Support (DBCS)

SAS에서 UNIX 명령어 실행 후 결과 받기

유닉스 SAS에서 디렉토리 내 화일 목록을 읽어오는 예 입니다.

filename oscmd pipe 'ls -l';

data dirlist;
   infile oscmd truncover;
   input mode $ 1-10 nlinks 12-14 user $ 16-23
         group $25-32 size 34-40 lastmod $ 42-53
         name $ 54-253;
run;

배치작업관리나 서버 모니터링 등에 응용하여 사용할 수 있습니다.

MONOTONIC 함수

다음과 같은 요구사항이 있을 경우 monotonic() 함수를 사용할 수 있습니다.

1) 추출한 데이터에 번호를 붙이고 싶다
2) 샘플로 10개만 추출하고 싶다

data step에서 _N_나, 오라클의 ROWNUM과 유사한 기능을 원할 때 사용할 수 있습니다.
물론 완전히 똑같이 사용할 순 없습니다만 상당히 유용한 경우가 있습니다.

[예제]
proc sql;
  select monotonic() as rowno
            , *  
  from   testdata
  where monotonic() le 10;
quit;
 
결과:
 
   rowno        id         y
-----------------------------
       1         1        66
       2         2        32
       3         3        10
       4         4        24
       5         5        50
       6         6        73
       7         7        40
       8         8        45
       9         9        88
      10        10        65

COLON (:) MODIFIER vs Truncated String Comparison Operators

특정 문자열이 '04'보다 작은 값으로 시작하는 경우 추출하는 예제입니다.
데이터 스텝에서와 proc sql에서 각가 다음과 같이 구현할 수 있습니다.


먼저 테스트용 데이터를 난수를 이용해서 생성합니다.

data testdata1;
    do id = 1 to 1000;
        x = ceil (ranuni(1) * 10000);
        charx = put (x, z4.);
        output;
    end;
run;


data step에서는 다음과 같이 구현됩니다.

/* Data Step : COLON (:) MODIFIER */
data result1;
    set testdata1;
    where charx lt :'04';
run;


동일한 결과를 Proc SQL에서 얻기 위한 샘플입니다.

/* Proc SQL : Truncated String Comparison Operators */
proc sql;
    create table result2
    as
    select *
    from testdata1
    where charx ltt '04';
quit;

Library 삭제하기

● 라이브러리 내용 모두 삭제하기
  ☞ proc datasets lib=work kill nolist memtype=all; quit;
      - work 대신에 지울 라이브러리 이름을 넣습니다


● 라이브러리 데이터셋만 삭제하기
  ☞ proc datasets lib=work kill nolist memtype=data; quit;


● 내용은 지우지 않고 라이브러리 정의만 삭제하기
  ☞ libname div_allo clear;



SAS 참조 사이트

[ Search ]
● SAS 검색 (Google)

[ Reference ]
● SAS Documentation
 
● SAS Intelligence Platform

● SAS Support

● Statwith (백승민)

● SAS Notes for Instant Usages (고려대)

● SAS tutorial - generation of a sample business datawarehouse scenario

● SAS 강좌와 통계컨설팅(조인호)

● SAS Conferences Paper

● SAS BI blog

● SAS Tips