所以我的数据集如下:
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;
答案 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
的情况这种情况可能永远不会发生。