2015-08-14 2 views
0

У меня есть набор данных, подобный приведенному ниже, где сумма выпала, но настройка остается. Для каждой строки сумма должна быть суммой предыдущей суммы и корректировки. Таким образом, сумма для наблюдения 5 составляет 134 (124 + 10).Создайте переменную, основанную на сумме двух переменных (один лаг)

У меня есть ответ, который дает мне следующее значение, но мне нужна какая-то рекурсия, чтобы получить от меня остальную часть пути. Что мне не хватает? Благодарю.

data have; 
    input amount adjust; 
cards; 
100 0 
101 1 
121 20 
124 3 
. 10 
. 4 
. 3 
. 0 
. 1 
; 
run; 

data attempt; 
    set have; 
    x=lag1(amount); 
    if amount=. then amount=adjust+x; 
run; 

data want; 
    input amount adjust; 
cards; 
100 0 
101 1 
121 20 
124 3 
134 10 
138 4 
141 3 
141 0 
142 1 
; 
run; 

EDIT:

пытается что-то также, как это сейчас, до сих пор не совсем то, что я хочу.

%macro doodoo; 
%do i = 1 %to 5; 

data have; 
    set have; 
/* if _n_=i+4 then*/ 
    amount=lag1(amount)+adjust; 
run; 

%end; 
%mend; 
%doodoo; 
+1

Причина, по которой ваш подход к задержке не работает, заключается в том, что lag возвращает предыдущее значение как последнее прочитанное из оператора set, а не значение, как это было в конце предыдущей итерации шага данных. – user667489

ответ

1

Не нужно использовать LAG() вместо RETAIN.

data want ; 
    set have ; 
    retain previous ; 
    if amount = . then amount=sum(previous,adjust); 
    previous=amount ; 
run; 
+0

Хорошо, это было переназначение переменной, которой я отсутствовал. Большая помощь. Еще раз спасибо! – pyll

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