지식노동자의 노트

CATS CATX 함수 (여러개의 문자열을 하나로 합쳐주는 SAS함수) 본문

SAS

CATS CATX 함수 (여러개의 문자열을 하나로 합쳐주는 SAS함수)

생각하는너구리 2012. 7. 5. 19:42
728x90

입력변수 : 문자열

반환 : 문자열의 결합


CATS용법1 : 문자형 변수를 합칠 때

결합문자열 = cats(변수1,변수2,.....,변수n);


CATS용법2 : 문자열을 직접 입력해서 합칠 때

결합문자열 = cats('문자군','문자야','문자네');


CATX용법1 : 문자형 변수를 구분자로 합칠 때

결합문자열 = catx('구분자',변수2,....,변수n);


CATX용법2 : 문자열을 직접 입력해서 구분자로 합칠 때

결합문자열 = catx('구분자','문자군','문자야');


1. Test Set 만들기


data test;
        input 도 $ 군 $ 면 $ 리 $;
datalines;
경상남도 함양군 마천면 구양리
소주도 독하군 마시면 취하리
;
run;

<그림1. 떨어진 주소 문자열>


엑셀에 concatenate함수가 있다면 SAS에는 cats와 catx 함수가 있습니다. 문자열을 서로 합치는 경우에는 cats, 특정 구분자를 사용해서 연결하는 경우에는 catx 를 사용합니다. 예를 들어 <그림1>과 같이 단위별로 저장된 주소 문자열을 가지고 완전히 연결된 하나의 주소를 얻고자 한다면 cats와 catx를 아래와 같이 활용 할 수 있습니다. 실전에서도 실제로 주소를 합치거나 국가번호, 지역번호 등으로 분리된 전화번호를 하이폰을 포함해서 합치는 경우 등등 다양하게 활용합니다.

2. 문자형 변수 합치기

data
 concatenated;
        set test;
        binded1 = cats(도,군,면,리);
        binded2 = catx('-',도,군,면,리);
        keep binded1 binded2;
run;

<그림2. 합쳐진 문자열 주소>


실제로 적용해 보겠습니다. binded1은 cats 함수를 사용해서 도,군,면,리 를 서로 구분자 없이 연결 했습니다. 실전에서 이렇게 결합하는 경우는 드물 것입니다. 보통은 단어 중간 중간에 공백이 포함되어 있어서 연결하면 자연스럽게 띄어 쓰기도 되는 경우가 많습니다. 가끔 오히려 그런 공백이 들어간 것을 지우고자 하는 니즈도 생깁니다만 그럴 때는 compress 함수를 쓰거나 여러개의 공백을 하나만 남기고자 할 때는 compbl 함수를 쓰면 됩니다.

다시 위의 예를 보시면 binded2는 catx를 사용하여 구분자를 넣고 개별 주소를 연결한 경우입니다. catx함수의 첫 번째 인수가 구분자 자리입니다.



3. 문자열 직접 합치기


title "문자열 직접 합치기";

data bind_string;

        binded_string1 = cats('나도','물랐네','몰랐어');

        binded_string2 = catx('***','정말','몰랐네','몰랐어');

proc print;

run;


<그림3. 문자열 직접 결합>



너무 당연한 얘기지만 꼭 변수를 사용해서만 결합하는 것은 아닙니다. 위에서 보듯이 결합하고 싶은 문자열을 직접 입력 할 수도 있습니다.

4. 확장 : 여러 변수 합치기

data many_string;
        input a1 $ a2 $ a3 $ a4 $ a5 $;
datalines;
a b c d e
f g h i j
k l m n o
;
run;

<그림4. 여러개의 문자열>


<그림4>와 같이 합치고 싶은 문자 변수가 아주 많다면 어떻게 하시겠습니까? 하나하나 다 타이핑 하시겠습니까? suffix가 숫자인 변수로 만들어서 아래와 같이 (of 시작 - 끝) 으로 표현하시면 됩니다. 변수의 suffix가 연속된 숫자가 아니라면 do loop를 사용해서 rename 하시면 되겠죠?

data many_binded;
        set many_string;
        binded1 = cats(of a1 - a5);
        binded2 = catx('***',of a1 - a5);
        keep binded1 binded2;
run;


오늘은 여기까지 입니다.

반응형
Comments