2016-06-17 2 views
1

내 문제는 다음과 같습니다 - 행 번호에 따라 다른 수식을 사용하여 다른 하나 (disc_pc_nonann)의 열 (diskont_faktor)을 생성합니다.SAS - 다른 열에서 하나의 열을 생성하는 수식

행 1에 대한 함수는 diskont_faktor = 1/disc_pc_nonann입니다.

행 2 ~ n에 대한 함수는 diskont_faktor = diskont_faktor (t-1)/disc_pc_nonann;

data soubor2; 
     set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 

    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else diskont_faktor = lag1(diskont_faktor)/disc_pc_nonann; 
run; 

그러나 SAS 행> 1. 기능 지연이 코드의이 설정에서 작동하지 않는 이유를 몇 가지 특별한 이유가 값을 계산하지 않습니다 나는 다음 코드를 시도

?

내가 성공하지 않고도이 버전을 시도 :
data soubor2; 
     set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 

    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else do; y=lag1(diskont_faktor); 
      diskont_faktor = y/disc_pc_nonann; 
     end; 
run; 

내가 잘못하고있는 무슨 조언 주셔서 감사합니다.

답변

4

LAG() 함수는 이전 관측 값을 반환하지 않습니다. 대신 이전에 스택에서 호출 된 값을 반환합니다. 따라서 관측치 중 일부에 대해서만 지연()을 실행하면 값이 제대로 쌓이지 않게됩니다.

이 문제를 해결하는 쉬운 방법 중 하나는 LAG() 함수 호출의 값을 변수에 배치하는 것입니다. 이렇게하면 모든 관측치에 대해 실행되므로 항상 이전 값을 반환합니다. LAG() 함수의 값 스트림을 방해하지 않고 원하는 경우 조건부로 변수를 참조 할 수 있습니다.

lag_diskont_faktor=lag(diskont_faktor); 
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
else diskont_faktor = lag_diskont_faktor/disc_pc_nonann; 

그러나 문제는 LAG()를 사용할 필요가없는 것 같습니다. RETAIN을 사용하면 SAS가 DATA 단계의 다음 반복을 시작할 때 새 변수를 누락되지 않도록 설정할 수 있습니다.

retain diskont_faktor; 
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
else diskont_faktor = diskont_faktor/disc_pc_nonann; 

당신도 RETAIN 문에서 변수의 초기 값을 설정하고 코드를 단순화 할 수있다.

retain diskont_faktor 1; 
diskont_faktor = diskont_faktor/disc_pc_nonann; 
+0

분명히 설명해 주셔서 감사합니다. –

1

프로그램 시작시 diskont_faktor 변수를 초기화해야하므로 처음에는 retain diskont_faktor;을 추가하십시오. lag1을 처음 호출하면 a. 그 시간에 대기열이 비어 있기 때문에 _n_ = 2의 경우 아무 것도 반환하지 않고 _n_= 1의 값을 대기열에 저장합니다. _n_ = 3은 작동해야하지만 _n_=2의 빈 결과를 대기열에 저장해야합니다. n=2에 대한 결과가 없으므로 _n_= 4는 아무 것도 반환하지 않습니다.

: 당신은 내가이 아 파크 지연, 를 해결하는 방법을 알고 있지만 나는 지체없이 당신에게 대체 솔루션을 제공 할 수있다 해달라고 그래서 심지어 _n_.

에 대한 _n_ 홀수없이 결과에 대한 결과를 가질 수 있도록이에 계속적으로 간다

data soubor2 (drop=diskont_faktor_old); 
    retain diskont_faktor_old; 
    set srv.data; 
    disc_pc_nonann = (1+DISC_PC/100)**(1/12); 
    if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann; 
    else diskont_faktor = diskont_faktor_old/disc_pc_nonann; 
    diskont_faktor_old=diskont_faktor; 
run; 
관련 문제