SAS연습200제/SAS데이터셋활용하기

Q_02_12. 두 데이터셋을 옆으로 합치기 -같은 변수 있는 경우

sas 2025. 3. 18. 21:32

SAS에서 MERGE 문을 사용해 두 데이터셋을 옆으로 합칠 때, 두 데이터셋에 같은 이름의 변수가 있으면 변수 충돌이 발생할 수 있습니다. 이 경우 SAS는 마지막에 병합된 데이터셋의 변수 값을 덮어씁니다. 이러한 문제를 방지하거나 원하는 결과를 얻기 위해 몇 가지 방법을 사용할 수 있습니다.

1. RENAME 옵션을 사용하여 변수 이름 변경하기

두 데이터셋 중 하나의 변수 이름을 변경하여 충돌을 방지할 수 있습니다.

data data1;
    input id name score;
    datalines;
    1 Alice 85
    2 Bob 90
    ;
run;

data data2;
    input id age score;
    datalines;
    1 20 88
    2 21 92
    ;
run;

data merged_data;
    merge data1(rename=(score=score1)) 
          data2(rename=(score=score2));
    by id;
run;
  • RENAME=(score=score1): data1의 score 변수를 score1로 이름 변경하여 충돌을 방지합니다.
  • 결과적으로 merged_data에는 id, name, age, score1, score2 변수가 포함됩니다.

2. COALESCE 함수를 사용하여 공통 변수 값 결합하기

만약 공통 변수의 값 중 하나라도 존재하면 해당 값을 선택하고 싶을 경우 COALESCE 함수를 사용하여 결합할 수 있습니다. COALESCE 함수는 첫 번째로 발견된 누락이 아닌 값을 반환합니다.

data merged_data;
    merge data1(rename=(score=score1)) 
          data2(rename=(score=score2));
    by id;
    score = coalesce(score1, score2); /* score1과 score2 중 값이 존재하는 변수 선택 */
run;

이 코드는 score라는 새 변수를 만들어 score1과 score2 중 누락되지 않은 첫 번째 값을 할당합니다.

 

3. 우선순위 설정하기

두 데이터셋에 같은 변수가 있을 때 특정 데이터셋의 값을 우선적으로 유지하려면, IF 문을 사용하여 조건을 설정할 수 있습니다.

data merged_data;
    merge data1(in=a) data2(in=b);
    by id;
    if a then score_final = score; /* data1의 score를 우선적으로 사용 */
    else if b then score_final = score; /* data2의 score를 사용 (data1에 값이 없을 경우) */
run;

이 코드는 data1의 score 값을 우선 사용하고, data1에 값이 없는 경우 data2의 score 값을 사용하여 score_final에 저장합니다.

요약

  • RENAME 옵션: 변수 이름을 변경하여 충돌을 방지.
  • COALESCE 함수: 값이 존재하는 첫 번째 변수를 선택.
  • 우선순위 설정: 특정 데이터셋의 값을 우선 사용.

이 방법들을 활용하면 같은 변수가 있을 때 원하는 방식으로 데이터셋을 병합할 수 있습니다.