2015-04-23 4 views
2

Я строю жизненный стол. Мои данные выглядит следующим образом:Функция LAG не завершена

age npx  
================= 
0-1 0.996 
1-4 0.9955 
5-9 0.9966 

Я хочу построить новую переменную lx. Значение lx для age="0-1" - 100,000. Значение для "1-4" будет lx * npx для предыдущей записи.

вот мой код:

if age = "0-1" then lx = 100000; 
lag_lx = lag1 (lx); 
lag_npx = lag1 (npx); 

lx = lag_lx * lag_npx; 

Что происходит, что программа прекращает вычисления lx после 2-й записи; От записи 3 на, lx имеет . (отсутствует)

+0

На каждой итерации шага данных '' lx' инициализируется отсутствует, и это только назначая '' lx', если возраст = «0-1» '. Но это условие верно только в первой записи, поэтому 'lx' отсутствует в других. Чтобы исправить это, добавьте 'keep lx;' в верхней части шага данных. –

ответ

0

Проблема в том, что значения хранятся в LAG только при использовании LAG. С сайта support.sas.com: «Сохранение значений в нижней части очереди и возврат значений из верхней части очереди происходит только тогда, когда выполняется функция. Вхождение функции LAGn, которая выполняется условно, будет хранить и возвращать значения только из наблюдения, для которых выполняется условие ».

Этот код не очень красив и может быть улучшен, но он выполняет эту работу.

data have; 
    input age $ npx; 
    datalines; 
0-1 0.996 
1-4 0.9955 
5-9 0.9966 
; 

data want; 
    set have; 
    IF _N_ = 1 Then lx = 100000; 
      lag_lx = lag(lx); 
      lag_npx = lag(npx); 
    IF _N_ ne 1 Then lx = lag_lx * lag_npx; 
      lag_lx = lag(lx); 
      lag_npx = lag(npx); 
    IF _N_ ne 1 Then lx = lag_lx * lag_npx; 
RUN; 
+0

Хитрость заключается в том, чтобы либо использовать 'lag' в выражении' ifn', либо поставить оператор 'lag' перед оператором' if'. Используя оператор 'Сохранить', как было предложено @Alex A, исправит другую проблему (и это означает, что в вашем ответе вам не потребуется столько операторов' if'). – Longfish

+0

Vasili - вот что я вложил: – Maringo7

4

Я бы вниз ifn маршрут здесь не ввернуть, что вы думаете, отставали значение, и это делает код очень простой (есть чтение из this paper). Кроме того, необходимо retain заявление, как заявил @Alex А.

data have; 
    input age $ npx; 
    datalines; 
0-1 0.996 
1-4 0.9955 
5-9 0.9966 
; 

data want; 
set have; 
retain lx; 
lx = ifn(age='0-1',100000,lx*lag(npx)); 
run; 
+0

Да, это сработало, хотя оно не выглядело правильно, пока я не понял, что lx с правой стороны является старым значением (сохраненным), а lx слева - расчетное значение. Спасибо. – Maringo7

Смежные вопросы