Sas 使用dif函数获得具有多个滞后的差异,而不指定滞后的数量
我想要一个新的数据集,其中变量y等于n行中的值减去滞后值。 原始数据集:Sas 使用dif函数获得具有多个滞后的差异,而不指定滞后的数量,sas,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
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
谢谢。可能的解决方案感谢Longfish的建议:
data want;
set test;
retain total 0;
total = total + x;
y = x - coalesce(lag(total), 0);
run;
可能的解决方案感谢Longfish的建议:
data want;
set test;
retain total 0;
total = total + x;
y = x - coalesce(lag(total), 0);
run;
不需要滞后或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
不需要滞后或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
您的解决方案可以进一步简化。我还建议不要使用关键字作为列名,例如SUM。数据需求;集合测试;_tot+x;y=x-聚结总t,0;滴滴;跑谢谢联合完全适合这里。我重新命名了sum,但保留了所有变量以提高透明度。您的解决方案可以进一步简化。我还建议不要使用关键字作为列名,例如SUM。数据需求;集合测试;_tot+x;y=x-聚结总t,0;滴滴;跑谢谢联合完全适合这里。我重命名了sum,但保留了所有变量以保持透明。