배열을 이용한 조건 분기로 일괄 처리
사양
배열과 루프 처리를 조합하는 것으로, 복수의 변수에 일괄로 같은 처리를 실시하는 매크로 변수.
예를 들면, 변수 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.)