Programming languages SAS中的条件保留变量

Programming languages SAS中的条件保留变量,programming-languages,conditional,sas,conditional-operator,Programming Languages,Conditional,Sas,Conditional Operator,我有以下SAS示例代码: data BEFORE; input v1 v2; datalines; 1 2 ; data AFTER; put 'Before IF: ' _ALL_; if _N_ = 1 then set BEFORE; put 'After IF : ' _ALL_; run; 输出为: BEFORE: v1=. v2=. _ERROR_=0 _N_=1 AFTER : v1=1 v2=2 _ERROR_=0 _N_=1 BEFORE:

我有以下SAS示例代码:

data BEFORE;
    input v1 v2;
datalines;
1 2
;

data AFTER;
    put 'Before IF: ' _ALL_;
    if _N_ = 1 then set BEFORE;
    put 'After  IF : ' _ALL_;
run;
输出为:

BEFORE: v1=. v2=. _ERROR_=0 _N_=1
AFTER : v1=1 v2=2 _ERROR_=0 _N_=1
BEFORE: v1=1 v2=2 _ERROR_=0 _N_=2
AFTER : v1=1 v2=2 _ERROR_=0 _N_=2
输出文件包含:

Obs    v1    v2
1      1     2
2      1     2

我知道集合将导入并保留BEFORE数据集的变量,但为什么BEFORE的记录会重复

我运行了您的示例代码,您忽略了一条关键信息:SAS日志中有一条消息:“注意:由于循环,数据步骤已停止。”。用谷歌搜索那条消息让我想到了。它建议在SET语句之前不要使用IF语句,而是使用OBS=data SET选项来限制读取的观察数

因此,您可以更改行:

if _N_ = 1 then set BEFORE;
致:


当我用这个更改运行代码时,“Before IF:”行仍然打印了两次,我不知道为什么会这样。但是循环注释并没有出现,所以我相信这就是解决方案。

集合是一个可执行语句,也就是说,除非被执行,否则在执行数据步骤时,它不会重置变量或加载下一个观察值的数据。(不过,在编译数据步骤时,它会设置或更改PDV。)由于if条件,它只执行一次


底部的隐式输出语句每次迭代输出一个观察值。SAS,监视数据步骤是否无限循环,在第二次迭代后停止数据步骤并生成注释。

SAS将无限执行,直到找到文件结束标记为止。它执行一次,保留变量。再次执行,复制保留值并终止。
set BEFORE(obs=1);