考虑

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/

10-13 03:34