sas-计算来自数据集的varibales组合的新varibale

时间:2018-01-03 21:36:49

标签: sas enterprise-guide

我正在处理一个复杂的问题,我在这里有一个包含900个观察数据和12个变量的数据集,这里有参考样本

S1  I1      s2     xoq  sxoq    running_sxoq
96  2913    501     50  1      1
96  2913    1315    50  10  11
96  2913    1322    50  9   20
96  2913    1345    50  15  35
96  2913    1366    50  1   36
96  2913    1426    50  26  62
96  2913    1522    50  18  80
96  2913    1582    50  42  122
96  2913    5789    50  40  162
96  21051   501      1  35  35
96  21051   1315    1   58  93
96  21051   1322    1   144 237
96  21051   1340    1   48  285
96  21051   1345    1   32  317
96  21051   1366    1   41  358
96  21051   1426    1   25  383
96  21051   1522    1   36  419
96  21051   1582    1   39  458
96  21051   5789    1   67  525

对于s1和I1列的每个组合,我需要计算一个新列,使其值等于第一个可用的sxoq列之和的xoq。 例如,对于第一个s1和i1对(96,2913),xoq为50,所需的计算列将具有值= sxoq,直到总和为50,其余值将为0.

desired output
    S1  I1       s2    xoq  sxoq  running_sxoq  calculated
    96  2913    501     50  1   1   1
    96  2913    1315    50  10  11  10
    96  2913    1322    50  9   20  9
    96  2913    1345    50  15  35  15
    96  2913    1366    50  1   36  1
    96  2913    1426    50  26  62  14
    96  2913    1522    50  18  80  0
    96  2913    1582    50  42  122 0
    96  2913    5789    50  40  162 0
    96  21051   501      1  35  35  1
    96  21051   1315    1   58  93  0
    96  21051   1322    1   144 237 0
    96  21051   1340    1   48  285 0
    96  21051   1345    1   32  317 0
    96  21051   1366    1   41  358 0
    96  21051   1426    1   25  383 0
    96  21051   1522    1   36  419 0
    96  21051   1582    1   39  458 0
    96  21051   5789    1   67  525 0

我尝试了很多不同的选择,但每个选项似乎都走在了一条永无止境的道路上。

首先,我连接了s1和I1列并使用了最后一个。识别S1andI1列的每个唯一组合

我也尝试将值读入多维数组,但它似乎不起作用。

如何获得所需的输出?

1 个答案:

答案 0 :(得分:0)

你基本上只需要使用BY组处理。您可能希望在启动新组时将新的运行总计重置为零。

所以基本上要获得增加运行总和所需的截断量,以便在XOQ的值上限,你可以使用MIN(,)函数。然后,当运行总和超过XOQ的值时,为了得到零,您可以使用MAX(,)函数。

data want ;
  set have ;
  by s1 i1 ;
  if first.i1 then new_running=0;
  want = max(0,min(sxoq,xoq-new_running));
  new_running + sxoq ;
run;