배열을 이용한 조건 분기로 일괄 처리
사양
배열과 루프 처리를 조합하는 것으로, 복수의 변수에 일괄로 같은 처리를 실시하는 매크로 변수.
예를 들면, 변수 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.sasdata 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;
Reference
이 문제에 관하여(배열을 이용한 조건 분기로 일괄 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatsuki7275/items/50a93518c0b2feb4c9b6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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.sasdata 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;
Reference
이 문제에 관하여(배열을 이용한 조건 분기로 일괄 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tatsuki7275/items/50a93518c0b2feb4c9b6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
%chgVarsValue(1, "", "UN", A B C D)
매크로 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;
Reference
이 문제에 관하여(배열을 이용한 조건 분기로 일괄 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tatsuki7275/items/50a93518c0b2feb4c9b6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)