使用dif函数获得具有几个滞后的差而无需指定滞后数

时间:2018-10-31 15:56:57

标签: sas

我想要一个新的数据集,其中变量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 :(得分:4)

不需要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

答案 1 :(得分:3)

可能的解决方案(感谢Longfish提出建议):

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