1

我试过这样的事情:

data wynik;
set dane;
if x>3 than x3=3*x;
else set dane2; x3=x2;set dane;
run;

dane 和 dane2 具有相同的行数

结果很有趣——x>3在设置 dane2 后条件仍然成立,但 SAS 总是首先观察——也就是说,它没有通过隐藏循环计数器的当前状态。提出问题 - SAS 在迭代用户可以访问的数据集时是否有/使用带计数器的隐藏循环?

编辑:也许我应该添加标题 - 没有显式循环,但这也会受到欢迎

4

1 回答 1

3

做一些假设:

data dane;
do x = 1 to 5;
output;
end;
run;

data dane2;
do x2 = 5 to 1 by -1;
output;
end;
run;

data wynik;
merge dane dane2;
if x > 3 then x3=3*x;
else x3=x2;
put x3=;
run;

它使用并排合并(不使用 by 语句合并)一次获得两个值。

要回答您的后续问题:

SAS 在迭代用户可以访问的数据集时是否有/使用带计数器的隐藏循环?

是的,它确实; _n_定义当前循环迭代(只要它没有被外部修改,它可以是 - 它只是一个没有写入数据集的常规变量)。因此,您可以类似地执行以下操作:

data wynik;
set dane;
if x > 3 then x3=x*3;
else do;
  set dane2 point=_n_;
  x3=x2;
end;
put x3=;
run;

并排合并是首选,因为它会更快,除非您很少需要查看 DANE2。它也更容易编码。

于 2013-05-22T18:41:59.437 回答