我正在处理一个复杂的问题,我在这里有一个包含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列的每个唯一组合
我也尝试将值读入多维数组,但它似乎不起作用。
如何获得所需的输出?
答案 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;