考虑
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
值(否则它将继承上次观察前一次 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
一定有问题。 最佳答案
您的陈述“因为数组 ay1 将在观察之间自动保留”是不正确的。声明为 _TEMPORARY_
的数组会自动保留。永久变量数组不是。
您可以使用以下方法进行测试:
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;
您将看到在每个组中的第一个 tcol 值之后,这些值将丢失。 IE。它们不在行之间保留。
添加
retain ay:;
到您的数据步骤,它应该按您的预期工作。
编辑:添加这个以显示它的工作原理。
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;
关于arrays - 调用缺少数组和将数组的每个元素设置为零之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31473983/