调用缺少数组和将数组的每个元素设置为零之间的差异

时间:2015-07-17 10:42:01

标签: arrays sas

考虑

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一定有问题。

1 个答案:

答案 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}}