2017-04-25 13 views
3

변수를 반복했지만 병합 할 데이터 집합이 두 개 있지만 행 수가 동일하지 않습니다. SAS에서 기본 동작은 일치하지 않는 모든 행의 값을 유지하는 것입니다. 예를 들어many-to-many SAS 병합에서 일치하지 않는 경우 어떻게 유지 된 값을 누락 값으로 설정합니까?

: b 세트가 단 두을 보유하면서 여기

data a; 
    input i x y; 
    datalines; 
     1 1 5 
     1 2 6 
     1 3 7 
     1 4 8 
     ; 
run; 

data b; 
    input i f g $; 
    datalines; 
     1 9 aa 
     1 8 bb 
     ; 
run; 

a 셋은 변수 i하여 네 개의 행을 갖는다. 그들은 데이터 세트에서 경기를하지 않았기 때문에

data c; 
    merge a b; 
    by i; 
run; 

Obs i x y f g 
1  1 1 5 9 aa 
2  1 2 6 8 bb 
3  1 3 7 8 bb 
4  1 4 8 8 bb 

당신은 유지 된 변수 f와 OBS 3 g 4의 값을 위해 그것을 볼 수 있습니다 변수 i에 의해 전적으로 병합

이 생산 a.

는 내가 생산하려고하면이 출력됩니다 :

Obs i x y f g 
1  1 1 5 9 aa 
2  1 2 6 8 bb 
3  1 3 7 .  
4  1 4 8 .  

내가 SAS 9.4을 사용하고이 내가 무엇을 시도했다입니다 :

data c; 
    if _n_>1 then do; 
     array num{*} _numeric_; 
     array char{*} _character_; 
     call missing(of num{*}); 
     call missing(of char{*}); 
     end; 
    merge a b; 
    by i; 
run; 

내 생각은 모든위한 것입니다 첫 번째 행 다음에 모든 변수를 누락으로 설정하여 일치하는 행이 없으면 값을 덮어 쓰지 않고 누락 된 상태로 남겨두기를 원합니다. 이렇게하면 보존 된 값이 제거됩니다.

PDV에 작성되어야하며, 모든 메타 데이터는 이러한 배열을 생성하고 누락을 설정하는 것이 가능해야한다 두 번째 행으로

,하지만 난이 오류가 점점 오전 :

WARNING: Defining an array with zero elements.

해결하는 방법에 어떤 제안 이 코드 또는 트릭을 수행 할 다른 코드?

답변

3

run 문의 기본 동작, 즉 특정 변수의 자동 출력 및 자동 호출이 무시되는 것이 좋습니다.

은 여기 output;합니다 (merge 또는 set 제표에 나타나지 않는 유일한 사람 반대) 누락 모든 변수를 설정 call missing(of _all_); (기본 동작과 동일) 한 후 자동 출력을 강제로.

data c; 
    merge a b; 
    by i; 
    output; 
    call missing(of _all_); 
run; 

당신이 말을해야하지 시작은 당신이 처음에 아직 변수를 정의하지 않은 것입니다 이유 - 그래서 _numeric_, _character_, 또는 _all_는 참조 아무 상관이없는 .

if 0 then set a b;으로 해결할 수 있지만 위의 해결 방법은 조금 더 간단합니다. 정말 잘 작동하고 속도와 이점이 같습니다.

data c; 
    if 0 then set a b; *defines all of the variables, but `if 0` means it will not pull any data; 
    call missing(of _all_); *sets everything missing; 
    merge a b; 
    by i; 
run;