배열을 이용한 조건 분기로 일괄 처리

7450 단어 SAS배열

사양



배열과 루프 처리를 조합하는 것으로, 복수의 변수에 일괄로 같은 처리를 실시하는 매크로 변수.
예를 들면, 변수 A, B, C, D 각각의 결측값을 모두 UN(Unknown)으로 치환할 때에 사용한다.
동일한 처리를 행하는 사양이기 때문에, 복수의 변수가 동일한 타입이라고 가정한다.

코드



chgVarsValue.sas
/*
 * Argument description
 *   type[num]:       if target variable is character, type = 1. else any values.
 *   tgtVal[num/chr]: Target value. if type=1, this argument needs double quotations.
 *   outVal[num/chr]: Output value. if type=1, this argument needs double quotations.
 *   chgVars[chr]:    Target variables. Enter with a space separater. 
 */
%macro chgVarsValue(type, bf, af, chgVars);
    %if &type. = 1 %then %let _type=$;
    %else _type=;
    array chgvv(*) &_type. &chgVars.;
    do _z = 1 to dim(chgvv);
        if chgvv(_z) = &bf. then chgvv(_z) = &af.;
    end;
    drop _z;    
%mend chgVarsValue;

처리 내용



전술한 바와 같이, 변수 A, B, C, D 각각의 결측값을 모두 UN(Unknown)으로 치환하는 경우는 다음과 같이 인수를 지정한다.

Example01.sas
%chgVarsValue(1, "", "UN", A B C D)

인수type로 유형을 지정해야 하는 이유는 array문에서 배열에 변수를 정의할 때 문자 유형의 경우 변수 이름 앞에 "$"가 필요하기 때문입니다.
즉, type=1인 경우는 array chgvv(*) $ A B C D가 되고, 그 이외의 경우 (수치형의 경우)는 array chgvv(*) A B C D가 됩니다.
배열에 지정된 변수는 모두 루프에서 순서대로 같은 if문의 처리가 실행되어 인수 bf로 지정된 값으로부터 인수 af로 지정된 값으로 변환됩니다.

실행 결과



매크로 chgVarsValue의 사용 예와 실행 결과 (데이터 세트 result)입니다.

Example02.sas
data sample;
    AA = "abc"; BB = "efg"; CC = "hij"; output;
    AA = "";    BB = "efg"; CC = "hij"; output;
    AA = "abc"; BB = "";    CC = "hij"; output;
    AA = "abc"; BB = "efg"; CC = "";    output;
    AA = "abc"; BB = "";    CC = "";    output;
    AA = "";    BB = "efg"; CC = "";    output;
    AA = "";    BB = "";    CC = "hij"; output;
    AA = "";    BB = "";    CC = "";    output;
run;

data result;
    set sample;
    %chgVarsValue(1, "", "UN", AA BB CC);
run;

좋은 웹페이지 즐겨찾기