首先,您的算法有错误:累积值
- 不应从自身计算下一个输入值,
- 但来自先前的累积值和相应的输入值。
你宁愿需要bb(i) = bb(i-1) + hh(i)。当然,这在i 为1 时是行不通的,因为没有hh(0),所以你从i = 2 开始这样做。
其次,您需要处理缺失值,类似于 SQL 中的 coalesce。让我们为此使用ifn,这是一个返回数值变量的函数。第一个参数是条件,第二个是条件为真时的返回值,第三个是条件为假时的返回值。
把它们放在一起;
data AFTER;
set TEMP;
array hh(*) N:;
array bb(3);
bb1 = ifn(missing(N1), 0, N1);
do i=2 to 3;
bb(i) = bb(i-1) + ifn(missing(hh(i)), 0, hh(i));
end;
drop i;
run;
这个解决方案的缺点是array bb(3)和do i=2 to 3中的硬编码3,用户3658367试图用dim(hh)解决这个问题。不幸的是,这只适用于其中一个。
这样更好;
proc sql;
select count(*)
into :B_count
from sasHelp.vColumn
where libname eq 'WORK'
and memName eq 'TEMP'
and name like 'N%';
quit;
data AFTER;
set TEMP;
array hh(*) N:;
array bb(&B_count);
bb1 = ifn(missing(N1), 0, N1);
do i=2 to &B_count;
bb(i) = bb(i-1) + ifn(missing(hh(i)), 0, hh(i));
end;
drop i;
run;
我添加了条件name like 'N%',因为我假设在您的实际问题中,TEMP 有其他变量,而不是您累积的变量。
关于下面的 cmets :如果你从一开始就没有参与这个帖子,你可以忽略它们。我将它们包含在上面的文本中。
(致这些 cmets 的作者:感谢您的意见。)