有条件地保留SAS中的变量

时间:2011-01-27 12:26:56

标签: 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: 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的记录会重复?

2 个答案:

答案 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监视以查看数据步骤是否无限循环,在第二次迭代后停止数据步骤并生成注释。