Начиная с этого:
data test;
datediff = dif(Date);
run;
Давайте обратимся ваш isues по одному. Во-первых, добавив заявление set
и инструкцию by
, мы также можем добавить first
и last
, чтобы вы могли определить, где вы находитесь. Предполагается, что он уже отсортирован by group
.
data test2;
set test;
by group;
datediff=dif(date);
run;
Это не работает по-другому (при условии, что у вас было задание типа изначально, во всяком случае). Но теперь у вас есть новые возможности.
Во-первых, хотя вы можете использовать dif
, я рекомендую метод retain
для этого. Вы можете более легко увидеть, что он делает, и избежать некоторых распространенных ошибок: в частности, lag
и dif
фактически не сравниваются с предыдущей записью - они создают очередь и сравниваются с тем, что может привести к осложнениям при использовании условных операторов.
data test2;
set test;
by group;
retain last_date;
if first.group then last_date=0;
datediff = date - last_date;
output;
last_date = date;
run;
Это делает то же самое, что и раньше - сравнивает предыдущее значение текущего значения - но делает его немного легче видеть, и мы добавим в качестве опции для сброса переменной last_date
когда first.group
верно - значение мы находимся в первой строке нового значения группы. Я не буду отбрасывать какие-либо из этих промежуточных переменных, но в производственном коде вы можете и должны. retain
означает, что значение будет сохраняться через строки (вместо того, чтобы сбрасываться каждый раз, когда вы получаете новую строку).
Теперь, когда у вас есть одна переменная, отслеживающая значение предыдущей строки date
, довольно легко надеяться увидеть, как мы можем сделать это для первой и последней разницы.
data test2;
set test;
by group;
retain last_date orig_date;
if first.group then do;
last_date=0;
orig_date=date; **new;
end;
datediff = date - last_date;
if last.group then group_datediff = date-orig_date; **new;
output;
last_date = date;
run;
Теперь мы сделали то же самое, что и раньше - но мы Переустановка orig_date каждый раз, когда мы видим first.group
и вычисления group_datediff, когда мы попали last.group
.
Вы можете вычислить dateDiff с помощью функции 'dif' вместо того, чтобы получать задержанную дату и вычитать ее с текущей даты (' dateDiff = ifn (first.group,., Dif (date)); ' – Longfish
Хорошая мысль @ Кит - отредактирован, чтобы быть более элегантным :-). –