2012-02-28 2 views
3

에서 작동하지 않습니다 (oldindex 및 oldreadmit은에서 표창을 유지한다)지연 기능. 여기에 내 프로그램의 일부입니다 SAS

문제는 oldindex = 1 다음 = 1 재입학을 위해 작동하지만 하지 않습니다 지연 (oldreadmit) = 1 다음에 readmit = 1. 문제가 무엇인지 말할 수 있습니까? 미리 감사드립니다!

else if 0< gap <= 30 then do; 
    index_d=0; 
    if lag(oldreadmit)=1 or oldindex=1 then readmit=1; 
     else oth=1; 
    oldindex=index_d; 
    oldreadmit=readmit; 
    end; 

제인

답변

7

은 SAS lag 기능은 많은 혼란의 원인이지만, 당신이 어떻게 작동하는지 이해하면 그것은 의미가 있습니다. 관측치가 3 개이고 처리 중에 두 번째 관측치를 건너 뛸 수있는 if 문이 있다고 가정합니다. 그런 다음 세 번째 관찰에 지연 기능을 적용하면 두 번째가 아니라 첫 번째 관측치가 반환됩니다. 마지막으로 관측 된 모든 관측치가 첫 번째 관측 대상이기 때문입니다.

이것이 의미하는 바는 lags와 if 문을 결합 할 때주의하십시오. 코드에서 if 문이 true 인 경우에만 실행되는 절에 지연이 있습니다. 이것은 이상한 결과를 줄 것입니다. 변수 예를 들어 l_oldreadmit 변수를 정의하고 if 문에서 앞에 앞에 오는 지연을 동일하게 지정해야합니다.

이 작동합니다 :

l_oldreadmit = lag(oldreadmit); 

if (... whatever you have here ...); 
else if 0< gap <= 30 then do; 
index_d=0; 
if l_oldreadmit=1 or oldindex=1 then readmit=1; 
    else oth=1; 
oldindex=index_d; 
oldreadmit=readmit; 
end; 
+0

니스 설명 ... –

+0

감사합니다 여러분. 많은 도움이됩니다. Jane – user1238178

1

을 Itzy가 lag 함수의 예기치 않은 동작이 혼란 위에 말했듯이. 운 좋은 사용자는 즉시 문제를 겪을 것이고 불행한 사용자는 문제가 있다는 것을 깨닫기 전에 오랜 시간 동안 갈 수도 있습니다. 이런 이유로 저는 지연 기능을 완전히 피합니다. 잘못 사용하는 것은 너무 쉽습니다. 쉽게 피할 수있는 실수를 저 지르지 않고 보호하고 싶습니다. 그렇게하면 코딩 시간을 줄이고 디버깅 시간을 줄일 수 있습니다.

나는 단지 retain 문을 사용하는 것이 좋습니다. 모두가 어떻게 작동하는지 이해하고 변수 들간의 관계 인 retain 문과 if 문을 잘 이해합니다.

3

버전 9부터는 표준 IF 문과 관련된 문제를 일으키지 않는 IFN 및 IFC 기능을 사용할 수있는 지연 기능 사용에 대한 또 다른 팁. 다음 코드의 결과를 살펴보면 내가 의미하는 바를 알 수 있습니다.

data test; 
    input col1; 
    if col1>0 then col2=lag(col1); 
    col3=ifn(col1>0,lag(col1),.); 
    cards; 
    1 
    2 
    0 
    5 
    0 
    4 
    ; 
    run; 

더 자세한 설명은 여기에 좋은 논문이 있습니다. http://www.howles.com/saspapers/CC33.pdf

+0

와우, 멋지다! 감사. – itzy

관련 문제