我有这个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
我知道SET会导入和保留BEFORE数据集的变量,但为什么BEFORE的记录会重复?
答案 0 :(得分:2)
我运行了您的示例代码,您省略了一条至关重要的信息:此消息在SAS日志中:“注意:数据STEP因循环而停止。”谷歌搜索该消息导致我a SAS paper describing the error。它建议不要在SET语句之前使用IF语句,而是使用OBS =数据集选项来限制读取的观察数量。
所以你要换行:
if _N_ = 1 then set BEFORE;
为:
set BEFORE(obs=1);
当我使用此更改运行代码时,“Before IF:”行仍然打印两次,我不确定为什么会这样。但循环注意没有发生,所以我认为这是解决方案。
答案 1 :(得分:0)
SET是一个可执行语句,也就是说,除非被执行,否则在执行数据步骤时,它不会重置变量或加载下一个观察数据。 (但是,在编译数据步骤时,它会设置或更改PDV。)由于if条件,它只执行一次。
底部的隐式OUTPUT语句每次迭代输出一个观察值。 SAS监视以查看数据步骤是否无限循环,在第二次迭代后停止数据步骤并生成注释。