【问题标题】:Conditionally retaining variables in SAS有条件地保留 SAS 中的变量
【发布时间】:2011-06-16 12:30:05
【问题描述】:

我有这个 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 的记录会重复?

【问题讨论】:

    标签: programming-languages conditional sas conditional-operator


    【解决方案1】:

    我运行了您的示例代码,但您遗漏了一条重要信息:此消息位于 SAS 日志中:“注意:DATA STEP 由于循环而停止。”。谷歌搜索该消息使我找到a SAS paper describing the error。它建议不要在 SET 语句之前使用 IF 语句,而是使用 OBS= 数据集选项来限制读取的观察数。

    所以你会换行:

    if _N_ = 1 then set BEFORE;
    

    到:

    set BEFORE(obs=1);
    

    当我使用此更改运行您的代码时,“Before IF:”行仍然打印了两次,我不确定为什么会这样。但是循环注意没有发生,所以我相信这是解决方案。

    【讨论】:

    • SAS 将无限执行,直到找到文件结束标记。它执行一次,保留变量。再次执行,复制保留的值并终止。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多