Как получить значения записи произвольного количества предыдущих записей?

#sas

#sas

Вопрос:

У меня есть набор данных, подобный этому :

 data test;
input Quantity Time Duration;
cards;
70 15 21 
85 15 14 
120 30 19 
60 15 0 
60 30 0 
60 30 37 
65 30 5 
30 30 30 
40 15 0
60 30 49 
;
run;
 

Если моя длительность равна 0, я хочу суммировать количество предыдущей строки с текущей строкой, а также время предыдущей строки с текущей, чтобы получить что-то вроде этого :

 70 15 21 
85 15 14 
120 30 19 
180 45 0 
240 75 0 
60 30 37 
65 30 5 
30 30 30 
70 45 0
60 30 49 
 

Проблема возникает, когда есть последовательные строки с длительностью = 0.

До сих пор я пробовал это :

 data test; 
set test; 
lag_time = lag(time);
lag_quantity = lag(quantity);
if duration = 0 then do ; 
quantity = quantity   lag_quantity;
time = time   lag_time;
end;
run;
 

Что дает мне то, что я хочу, но только для первой продолжительности = 0.

У кого-нибудь есть другой подход?

Большое вам спасибо!!

Комментарии:

1. Я немного изменил заголовок, так как заголовок вашего вопроса в некоторой степени вводил в заблуждение. Однако мне не нравится новое название, поэтому, пожалуйста, отредактируйте его на что-то лучшее, если кто-нибудь может придумать лучший способ выразить это.

Ответ №1:

 data test1; 
set test; 
retain lag_quantity lag_time;
if duration = 0 then do ; 
quantity = quantity   lag_quantity;
time = time   lag_time;
end;
lag_time = time;
lag_quantity = quantity;
run;
 

Комментарии:

1. Вы также можете попытаться объяснить, как, по вашему мнению, этот код будет полезен для OP и как вы можете сказать, что это поможет решить проблему без объяснения причин?

2. @Afzaal: нет необходимости, Джо уже сделал это, просто небольшое изменение. Я думал о публикации в качестве комментария к ответу Джо, но он был нечитаемым

3. Большое вам спасибо. Это именно то, что я хочу, и это альтернатива использованию функции задержки. Еще раз спасибо!

4. @user3645882 Вы должны включить объяснение кода, чтобы это был хороший ответ. Не полагайтесь на другие ответы, особенно на те, которые (по крайней мере, немного) неверны, поскольку они, вероятно, будут удалены. Ваш ответ всегда должен стоять сам по себе.