Sas 使用dif函数获得具有多个滞后的差异,而不指定滞后的数量

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

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

谢谢。

可能的解决方案感谢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,但保留了所有变量以保持透明。