如何使用Prco Expand创建带头的移动总和?

时间:2017-02-22 15:04:50

标签: sas

我需要在SAS中计算10天领先的移动金额。我假设proc扩展可能是最好的方法。我可以使用以下代码执行此操作。但是如果可能的话,我想消除数据步骤并减少proc扩展中使用的行数。

proc expand data=averages out=transformed;

id dt;

convert x=x_lead_10 / transform=(lead 10);
convert x=x_lead_11 / transform=(lead 11);
convert x=x_lead_12 / transform=(lead 12);
convert x=x_lead_13 / transform=(lead 13);
convert x=x_lead_14 / transform=(lead 14);
convert x=x_lead_15 / transform=(lead 15);
convert x=x_lead_16 / transform=(lead 16); 

data formatted;
set work.transformed;
x_sum = sum(x_lead_10,x_lead_11,x_lead_12,x_lead_13,x_lead_14,x_lead_15,x_lead_16)
run;

我的工作原理,但我正试图找到一种更有效的方法来编写代码。我为多个变量执行此操作会使我的代码快速拥挤。

2 个答案:

答案 0 :(得分:1)

这不是确切的,但可以帮助你非常接近。 x_movSum是您想要的值但不在您想要的单元格中,它位于第11行,即前10个点的总和。 编辑:现在确切,请参阅下面的新代码。

无论如何,这里是你的代码应该如何构建和计算:

*create sample data to work with;
data random;
    call streaminit(25);

    do date='01Jan2016'd to '31Dec2016'd;
        x=round(Rand('normal', 100, 15), 0.01);
        output;
        format date date9.;
    end;
run;

*Modified calculation;
proc expand data=random out=want;
    id date;
        convert x= x_movSum /transformout = (movsum 10 trimleft 9); /*This is the correct calculation expected*/
convert x = x_movSumFIRST / transformout = (reverse movsum 10 trimleft 9 reverse);*Correct numbers moved up to first record;
run;

* the manual way to do this in a data step. Depending on how much customization you need this may be easier;
data check;
    set want;
    array _t (0:9) _temporary_;
    _t(mod(_n_, 10))= x;

    if _n_ > 10 then
        do;
            check = sum(of _t(*));
        end;
run;    

答案 1 :(得分:0)

只需将LEAD转换与MOVSUM转换相结合。

convert x=want2 / transformout=(lead 10 reverse movsum 7 reverse) ;

所以,如果你的系列只是1,2,3,那么第一个计算值将是11 + 12 + 13 + 14 + 15 + 16 + 17 = 98。