Используйте функцию dif, чтобы получить разницу с несколькими лагами без указания количества лагов. - PullRequest
0 голосов
/ 31 октября 2018

Я хочу новый набор данных, в котором переменная y равна значению в строке n минус значения лагов. Исходный набор данных:

data test;
    input x;
    datalines;
20
40
2
5
74
;
run;

Я использовал функцию dif , но она возвращает разницу с одним лагом:

data want;
    set test;
    y = dif(x);
run;

И я хочу:

_n_ = 1  y = 20
_n_ = 2  y = 40 - 20 = 20
_n_ = 3  y = 2 - (40 + 20) = -58
_n_ = 4  y = 5 - (2 + 40 + 20) = - 57
_n_ = 5  y = 74 - (5 + 2 + 40 + 20) = 7

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Нет необходимости в lag() или dif(). Просто создайте другую переменную, чтобы сохранить промежуточный итог.

data want ;
  set test;
  y=x-cumm;
  output;
  cumm+x;
run;

Я сохранил дополнительный столбец и вывел значения перед обновлением промежуточного итога, чтобы было понятнее, какое значение использовалось при расчете Y.

Obs     x      y    cumm

 1     20     20      0
 2     40     20     20
 3      2    -58     60
 4      5    -57     62
 5     74      7     67
0 голосов
/ 31 октября 2018

Возможное решение (спасибо Longfish за предложения):

data want;
    set test;
    retain total 0;
    total = total + x;
    y = x - coalesce(lag(total), 0);
run;
...