考虑
data want;
set have;
array ay1{7};
retain ay1:;
if first.tcol then do;
call missing(of ay1{*});
end;
if ay1{7} > a then do;
[other statements to determine value of ay1]
end;
else do;
[other statements to determine value of ay1]
end;
by tcol;
run;
由于数据ay1
将在观察之间自动保留,如果我希望程序进行一些分组处理,我需要在遇到新的ay1
时重置tcol
值value(否则它将继承上次tcol
值的上次观察值。这将影响if ay{7} > a
,因此所有其他后续语句都会受到影响)。
在我目前的代码中,我将通过
重置数组do i = 1 to dim(ay1);
ay1{i} = 0;
end;
这项工作罚款。对于每个tcol
值的第一个obs,它会先将ay1
的所有值重置为0,然后在此观察中执行[other statement]
更新ay1
。
如果我使用call missing(of ay1{*});
,对于每个tcol
值的第一个obs,它会将ay1
的每个值设置为缺失(如预期的那样)。但以下[other statement]
将不更新ay1
。 (我已在[other statement]
中放置了几个put语句作为调试步骤,以确保此部分已运行。除了更新ay1
值之外,它还执行所有其他工作。
如果first.tcol
失败,一切似乎都恢复正常(没有错误,但输出数据集错误,因为每个组中的第一步都有所有意外值)。所以我认为在这里使用call missing
一定有问题。
答案 0 :(得分:2)
您的陈述"由于数组ay1将在观察之间自动保留"是不正确的。声明为data want;
set have;
array ay1{7};
by tcol;
if first.tcol then do;
do i=1 to 7;
ay1[i] = 1;
end;
end;
run;
的数组会自动保留。永久变量数组不是。
你可以用以下方法测试:
retain ay:;
您将看到在每组中的第一个tcol值之后,将丢失这些值。 I.E.它们没有保留在行之间。
添加
data have;
tcol = 1;
a = 1;
output;
tcol = 1;
a = 10;
output;
run;
data want;
set have;
array ay1{7};
retain ay1:;
by tcol;
if first.tcol then do;
call missing(of ay1{*});
end;
if ay1{7} > a then do;
do i=1 to 7;
ay1[i] = -a;
end;
end;
else do;
do i=1 to 7;
ay1[i] = 999;
end;
end;
run;
到您的数据步骤,它应该按预期工作。
编辑:添加此内容以显示其工作原理如何。
{{1}}