2014-07-09 2 views
1

두 데이터 세트를 스태킹하는 다음 두 가지 대체 방법의 결과가 다른 이유는 무엇입니까?데이터 세트를 스태킹 할 때 예기치 않은 결과가 발생했습니다.

data work.a; 
    length ds $1; 
    ds = 'A'; 
    do i = 1 to 3; 
     output; 
    end; 
run; 
data work.b; 
    length ds $1; 
    ds = 'B'; 
    do i = 1 to 3; 
     do j = 1 to 3; 
      output; 
     end; 
    end; 
run; 

*- ALTERNATIVE 1 -*; 
data work.c; 
    set work.a work.b; 
    if j = . then j = i; 
run; 

*- ALTERNATIVE 2 -*; 
data work.d; 
    set work.a work.b; 
run; 
data work.d; 
    set work.d; 
    if j = . then j = i; 
run; 

제 생각에 데이터 세트 c와 d는 모두 j = i이고 ds = 'A'입니다.

답변

2

이유는 SET 문을 통해 읽는 변수에 대한 자동 RETAIN입니다. set 문을 통해 읽은 모든 변수는 set 문의 다음 번 반복 (set 문의 데이터 집합의 새 값이 대체 됨)까지 PDV에 유지됩니다.

컴파일하는 동안 SET 문에있는 데이터 세트의 모든 변수가 PDV에서 작성됩니다.
첫 번째 반복 실행에서 SET 문 (work.a)의 첫 번째 데이터 집합이 읽히고 값 1이 i에 제공됩니다. 변수 j는 널 (.)이므로 논리 조건이 참이고 j는 1이됩니다. 두 번째 반복에서 i는 데이터 세트 work.a의 값에 따라 2로 대체되고 j는 (작업으로) 대체되지 않습니다. b는 읽히지 않습니다.) - 그래서 그것은 유지되고 그래서 그것은 널이 아니기 때문에 논리는 실행되지 않습니다.

추가 예로서,이 sugi paper의 예 3을 참조하십시오.

data work.c; 
    set work.a work.b; 
    if j = . then XXX = i; 
run; 

(반대로) 문을 유지하려면 SET 문에서 데이터 세트에서 컴파일되지 않습니다 NEW 변수를 유지하는 것이 필요하다 : 그것은 당신이 다음과 같이 단순히 새로운 변수를 만들어이 문제를 해결할 수 있습니다 보여줍니다.

관련 문제