计算SAS阵列中特定范围内的值

时间:2018-10-19 07:46:26

标签: arrays count sas sum

所以我的数据集如下:

ABC1 ABC2 ABC3 ABC4 ABC5 DEF1 DEF2 DEF3 DEF4 DEF5  
  1    0    0    1    .    0    1    1    0   .

我希望我的输出是:

XYZ1 XYZ2 XYZ3 XYZ4 XYZ5
 0    1    1    0    .       

基本上,如果DEF2 = 1且ABC3和ABC4和ABC5的计数为1大于0,则XYZ2为1。

我已经尝试了以下代码,但是没有用

data want;
set have;
array ABC ABC:;
array DEF DEF:;
array XYZ [5] $1;
do i = 1 to dim(ABC)-5;

if ABC(i) = . then XYZ(i) = '';
else if (DEF(i) = 1 and sum(ABC(i+1), ABC(i+3)) > 0) then XYZ(i) = 1;
else XYZ(i) = 0;
end;
drop i;
run;

1 个答案:

答案 0 :(得分:0)

让我们更好地理解事物

index ABC DEF XYZ (wanted)
----- --- --- ---
  1    1   0   0 (because DEF=0)
  2    0   1   1 (sum ABC index 2..5 because DEF=1 @ index 2)
  3    0   1   1 (sum ABC index 3..5 because DEF=1 @ index 3)
  4    1   0   0 (because DEF=0)
  5    .   .   . (because DEF=.)

现在将这种理解应用于在排列时处理行的变量。这些项目将从5到1处理,因此可以计算running_sum并在必要时应用。

data want;
  set have;

  array abc abc:;
  array def def:;
  array xyz(5);

  running_sum = .;
  do index = dim(abc) to 1 by -1;
    if not missing(abc(index)) then running_sum + abc(index);
    if def(index) in (., 0)
      then xyz(index) = def(index);
      else xyz(index) = running_sum;
  end;
run;

问题中并未列出所有处理规则,例如

  • abc(j) = .abc(k) ne .k > j的情况

这种情况可能永远不会发生。