我想要一个新的数据集,其中变量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
谢谢。
答案 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;